21#ifndef _SIMULATOR_STATE_H_
22#define _SIMULATOR_STATE_H_
30#include <unordered_map>
31#include <unordered_set>
36#include "framework/linalg/vector.hpp"
46template <
typename Time>
class IOperation;
144 const std::string value = std::to_string(seed);
159 return auxUniform(auxRng);
188 virtual void InitializeState(
size_t num_qubits, std::vector<std::complex<double>> &litudes) = 0;
203 virtual void InitializeState(
size_t num_qubits, AER::Vector<std::complex<double>> &litudes) = 0;
241 throw std::runtime_error(
"This simulator does not support initialization to a computational "
258 throw std::runtime_error(
"This simulator does not support initialization to a computational "
285 throw std::runtime_error(
"This simulator does not support initialization to a mixture of "
286 "computational basis states");
304 throw std::runtime_error(
"This simulator does not support initialization to a mixture of "
305 "computational basis states");
416 static const std::vector<std::shared_ptr<Circuits::IOperation<double>>> empty;
488 virtual void Configure(
const char *key,
const char *value) = 0;
577 throw std::runtime_error(
"This simulator does not support exact quantum-channel evolution");
587 throw std::runtime_error(
"This simulator does not support ProbabilityBits");
592 throw std::runtime_error(
"This simulator does not support DensityMatrixElementBits");
597 throw std::runtime_error(
"This simulator does not support GetDensityMatrix");
602 throw std::runtime_error(
"This simulator does not support ExpectationValueComplex");
607 virtual std::vector<std::complex<double>>
ExpectationValuesComplex(
const std::vector<std::string> &paulis,
bool normalized =
true)
const
609 std::vector<std::complex<double>> values;
610 values.reserve(paulis.size());
611 for (
const auto &pauli : paulis)
618 throw std::runtime_error(
"This simulator does not support ApplyOperator");
623 throw std::runtime_error(
"This simulator does not support MoveAtBeginningOfChain");
630 throw std::runtime_error(
"This simulator does not expose a density-matrix trace");
635 throw std::runtime_error(
"This simulator does not expose density-matrix purity");
640 throw std::runtime_error(
"This simulator does not expose Tr(rho^2)");
645 throw std::runtime_error(
"This simulator does not support density-matrix overlap");
650 throw std::runtime_error(
"This simulator does not expose a Hermiticity residual");
655 throw std::runtime_error(
"This simulator does not expose a Hermiticity test");
660 throw std::runtime_error(
"This simulator does not support partial trace");
665 throw std::runtime_error(
"This simulator does not support mixed-state fidelity");
670 throw std::runtime_error(
"This simulator cannot restore density-matrix trace");
675 throw std::runtime_error(
"This simulator cannot hermitize its density matrix");
681 throw std::runtime_error(
"This simulator is not a matrix-product state or operator");
687 throw std::runtime_error(
"This simulator is not a matrix-product state or operator");
761 if (!std::isfinite(duration) || duration < 0.0)
762 throw std::invalid_argument(
"T1-relaxation duration must be finite and nonnegative");
763 if (std::isnan(t1) || t1 <= 0.0)
764 throw std::invalid_argument(
"T1 must be positive (infinity is allowed)");
765 const double gamma = std::isinf(t1) ? 0.0 : -std::expm1(-duration / t1);
782 if (!std::isfinite(duration) || duration < 0.0)
783 throw std::invalid_argument(
"Phase-damping duration must be finite and nonnegative");
784 if (std::isnan(tPhi) || tPhi <= 0.0)
785 throw std::invalid_argument(
"T_phi must be positive (infinity is allowed)");
786 const double gamma = std::isinf(tPhi) ? 0.0 : -std::expm1(-2.0 * duration / tPhi);
850 throw std::runtime_error(
"Mixed states have no unique statevector");
854 for (
size_t i = 0; i < result.size(); ++i)
864 throw std::runtime_error(
"This simulator does not support ExpectationValueOperators");
957 std::vector<double> values;
958 values.reserve(paulis.size());
959 for (
const auto &pauli : paulis)
974 observers.insert(observer);
987 observers.erase(observer);
1160 virtual const std::unordered_map<std::string, std::string> &
GetConfigMap()
const = 0;
1166 auxRng.seed(
DeriveSeed(seed, kAuxRngStream));
1177 notifyObservers =
false;
1187 notifyObservers =
true;
1199 if (!notifyObservers)
1202 for (
auto &observer : observers)
1204 observer->Update(affectedQubits);
1211 return notifyObservers;
1217 static constexpr uint64_t kAuxRngStream = 0x52454144ULL;
1219 std::unordered_set<std::shared_ptr<ISimulatorObserver>> observers;
1220 bool notifyObservers =
true;
1221 std::mt19937_64 auxRng{std::random_device{}()};
1222 std::uniform_real_distribution<double> auxUniform{0.0, 1.0};
Backend-independent constructors for local CPTP quantum channels.
Interface class for a quantum computing simulator state.
bool NotificationsEnabled() const noexcept
double RandomUniform()
Uniform random number in [0, 1) from the auxiliary stream.
virtual void ApplyReset(const Types::qubits_vector &qubits)=0
Performs a reset of the specified qubits.
virtual bool IsQcsim() const =0
Returns if the simulator is a qcsim simulator.
virtual double ProbabilityBits(const std::vector< bool > &)
MPO extensions: bit vectors are q0-first; matrices use logical basis order.
virtual std::complex< double > ExpectationValueComplex(const std::string &, bool=true) const
virtual void SaveStateToInternalDestructive()=0
Saves the state to internal storage.
void ApplyTwoQubitDepolarizingNoise(Types::qubit_t qubit0, Types::qubit_t qubit1, double errorProbability)
virtual void SetAutomaticLookaheadDepth(int depth)
void Notify()
Starts notifying observers.
virtual double getGrowthFactorSwap() const
virtual void SetSeed(uint64_t seed)
Seed every random stream owned by this simulator.
virtual std::vector< double > Probabilities(const Types::qubits_vector &qubits)=0
Returns the probabilities of the specified outcomes.
void ApplyTwoQubitDepolarizingMixingNoise(Types::qubit_t qubit0, Types::qubit_t qubit1, double mixingProbability)
virtual std::vector< std::complex< double > > ExpectationValuesComplex(const std::vector< std::string > &paulis, bool normalized=true) const
void ApplyPauliChannel(Types::qubit_t qubit, double px, double py, double pz)
Apply a single-qubit Pauli channel specified by X/Y/Z probabilities.
virtual std::complex< double > ExpectationValueOperators(const Types::qubits_vector &, const std::vector< Eigen::MatrixXcd > &)
virtual void SetInitialQubitsMap(const std::vector< long long int > &initialMap)
Sets the initial qubits map, if possible.
virtual bool IsDensityMatrixHermitian(double=1e-10) const
virtual void SetUpcomingGates(const std::vector< std::shared_ptr< Circuits::IOperation< double > > > &)
Supplies upcoming gates for lookahead swap optimization.
void ApplyPhaseDampingFromTime(Types::qubit_t qubit, double duration, double tPhi)
Pure phase damping for a physical duration and T_phi.
void UnregisterObserver(const std::shared_ptr< ISimulatorObserver > &observer)
Unregisters an observer.
virtual void InitializeToBasisState(size_t num_qubits, const std::vector< bool > &basisState)
Initializes the state to a computational basis state.
virtual Eigen::MatrixXcd GetDensityMatrix(bool=true) const
virtual void RestoreState()=0
Restores the state from the internally saved state.
void ApplyCorrelatedPhaseFlipNoise(Types::qubit_t qubit0, Types::qubit_t qubit1, double probability)
virtual void SaveState()=0
Saves the state to internal storage.
virtual std::complex< double > ProjectOnZero()=0
Projects the state onto the zero state.
virtual double DensityMatrixPurity() const
virtual std::complex< double > DensityMatrixOverlap(const IState &) const
void ApplyKrausChannel(const Types::qubits_vector &targets, const QuantumChannel::KrausOperators &krausOperators)
Apply an arbitrary CPTP map supplied in Kraus form.
virtual double Probability(Types::qubit_t outcome)=0
Returns the probability of the specified outcome.
virtual double DensityMatrixHermiticityResidual() const
virtual void Initialize()=0
Initializes the state.
void ApplyPhaseFlipNoise(Types::qubit_t qubit, double probability)
virtual size_t AllocateQubits(size_t num_qubits)=0
Allocates qubits.
virtual void Trim()
Compress a matrix-product state or operator to its configured limits.
void DontNotify()
Stops notifying observers.
void ApplyBitFlipNoise(Types::qubit_t qubit, double probability)
void ApplyDepolarizingNoise(Types::qubit_t qubit, double errorProbability)
Depolarizing noise using total nonidentity-Pauli probability p.
virtual void InitializeState(size_t num_qubits, std::vector< std::complex< double > > &litudes)=0
Initializes the state.
virtual void setGrowthFactorGate(double factor)
void ApplyT1Relaxation(Types::qubit_t qubit, double gamma)
Alias for the exact T1 amplitude-damping channel.
virtual std::vector< std::complex< double > > GetStateVector()
virtual std::vector< double > AllProbabilities()=0
Returns the probabilities of all possible outcomes.
virtual void RestoreDensityMatrixTrace()
virtual void InitializeState(size_t num_qubits, AER::Vector< std::complex< double > > &litudes)=0
Initializes the state.
void SeedAuxiliaryRng(uint64_t seed)
Shared by SetSeed and backend Configure("seed") implementations.
virtual double FidelityWithStatevector(const Eigen::VectorXcd &) const
virtual SimulationType GetSimulationType() const =0
Returns the type of simulation.
virtual void InitializeToBasisState(size_t num_qubits, Types::qubit_t basisState)
Initializes the state to a computational basis state.
void ApplyPhaseDamping(Types::qubit_t qubit, double gamma)
Phase damping with coherence multiplier sqrt(1-gamma).
virtual std::vector< bool > MeasureMany(const Types::qubits_vector &qubits)=0
Performs a measurement on the specified qubits.
virtual void ApplyQuantumChannel(const Types::qubits_vector &targets, const QuantumChannel &channel)
Applies a local CPTP quantum channel to one or two qubits.
virtual long long int GetGatesCounter() const
Returns the gates counter.
void RegisterObserver(const std::shared_ptr< ISimulatorObserver > &observer)
Registers an observer.
void ApplyCorrelatedPhaseFlipNoise(Types::qubit_t qubit0, Types::qubit_t qubit1, double probability, double correlation)
virtual void RestoreInternalDestructiveSavedState()=0
Restores the state from the internally saved state.
virtual void SetMultithreading(bool multithreading=true)=0
Enable/disable multithreading.
virtual void SetGatesCounter(long long int)
Sets the gates counter.
virtual double ExpectationValue(const std::string &pauliString)=0
Returns the expected value of a Pauli string.
void ApplyBitPhaseFlipNoise(Types::qubit_t qubit, double probability)
virtual std::complex< double > Amplitude(Types::qubit_t outcome)=0
Returns the amplitude of the specified state.
virtual size_t GetNumberOfQubits() const =0
Returns the number of qubits.
virtual void InitializeToMixtureOfBasisStates(size_t num_qubits, const std::vector< std::pair< std::vector< bool >, double > > &mixture)
Initializes the state to a classical mixture of computational basis states.
virtual SimulatorType GetType() const =0
Returns the type of simulator.
void ApplyDephasingNoise(Types::qubit_t qubit, double probability)
Noise.h dephasing is a stochastic phase flip, not phase damping.
virtual std::complex< double > AmplitudeRaw(Types::qubit_t outcome)=0
Gets the amplitude.
virtual size_t GetCurrentMaxBondDimension() const
Returns the maximum bond dimension reached.
virtual void SetUseOptimalMeetingPosition(bool)
Enables or disables optimal meeting position for MPS swaps.
virtual void HermitizeDensityMatrix()
virtual void Flush()=0
Flushes the applied operations.
virtual std::complex< double > DensityMatrixTraceOfSquare() const
virtual std::unordered_map< std::vector< bool >, Types::qubit_t > SampleCountsMany(const Types::qubits_vector &qubits, size_t shots=1000)=0
Returns the counts of the outcomes of measurement of the specified qubits, for repeated measurements.
virtual void MoveAtBeginningOfChain(const Types::qubits_vector &)
virtual void Configure(const char *key, const char *value)=0
Configures the state.
virtual bool IsRoutingLookaheadEnabled() const
virtual void Clear()=0
Clears the state.
virtual const std::unordered_map< std::string, std::string > & GetConfigMap() const =0
void ApplyPauliChannel(const Types::qubits_vector &targets, const std::vector< double > &probabilities)
Apply an arbitrary one- or two-qubit Pauli channel.
void ClearObservers()
Clears all observers.
void NotifyObservers(const Types::qubits_vector &affectedQubits)
Notifies observers.
virtual void SetLookaheadDepth(int)
Sets the lookahead depth for swap optimization.
virtual void ApplyOperator(const Types::qubits_vector &, const Eigen::MatrixXcd &, bool=false)
virtual bool GetMultithreading() const =0
Get the multithreading flag.
virtual void SetLookaheadDepthWithHeuristic(int)
Sets the lookahead depth for swap optimization.
virtual bool SupportsQuantumChannels() const
Returns whether this state retains channel ensembles directly.
void ApplyT1RelaxationFromTime(Types::qubit_t qubit, double duration, double t1)
Exact T1 relaxation for a physical duration and time constant.
virtual size_t Measure(const Types::qubits_vector &qubits)=0
Performs a measurement on the specified qubits.
virtual std::vector< bool > MeasureNoCollapseMany()=0
Measures all the qubits without collapsing the state.
virtual ~IState()=default
Virtual destructor.
void ApplyChannel(const Types::qubits_vector &targets, const QuantumChannel::KrausOperators &krausOperators)
Alias matching the channel terminology used by QCSim's dense backend.
void ApplyGeneralizedAmplitudeDamping(Types::qubit_t qubit, double gamma, double excitedStatePopulation)
void ApplyThermalRelaxation(Types::qubit_t qubit, double duration, double t1, double t2, double excitedStatePopulation=0.0)
virtual std::complex< double > DensityMatrixTrace() const
Mixed-state diagnostics.
virtual void IncrementGatesCounter()
Increments the gates counter.
virtual void InitializeState(size_t num_qubits, Eigen::VectorXcd &litudes)=0
Initializes the state.
void ApplyDepolarizingMixingNoise(Types::qubit_t qubit, double mixingProbability)
Depolarizing replacement (1-p)rho + p I/2, fully mixed at p=1.
virtual size_t GetExecutedMaxBondDimension() const
virtual bool SupportsMPSSwapOptimization() const
Returns if the simulator supports MPS swap optimization.
virtual double getGrowthFactorGate() const
virtual Eigen::MatrixXcd PartialTrace(const Types::qubits_vector &) const
void ApplyAmplitudeDamping(Types::qubit_t qubit, double gamma)
virtual bool SwapGatesRelabelQubits() const
virtual std::vector< double > ExpectationValues(const std::vector< std::string > &paulis)
virtual void ReCanonicalize()
Restore the canonical form of a matrix-product state or operator.
virtual std::complex< double > DensityMatrixElementBits(const std::vector< bool > &, const std::vector< bool > &) const
virtual void Reset()=0
Just resets the state to 0.
virtual void InitializeToMixtureOfBasisStates(size_t num_qubits, const std::vector< std::pair< Types::qubit_t, double > > &mixture)
Initializes the state to a classical mixture of computational basis states.
virtual std::string GetConfiguration(const char *key) const =0
Returns configuration value.
static uint64_t DeriveSeed(uint64_t seed, uint64_t stream)
virtual std::unordered_map< Types::qubit_t, Types::qubit_t > SampleCounts(const Types::qubits_vector &qubits, size_t shots=1000)=0
Returns the counts of the outcomes of measurement of the specified qubits, for repeated measurements.
virtual void setGrowthFactorSwap(double factor)
virtual const std::vector< std::shared_ptr< Circuits::IOperation< double > > > & GetUpcomingRoutingOperations() const
virtual Types::qubit_t MeasureNoCollapse()=0
Measures all the qubits without collapsing the state.
A local completely-positive, trace-preserving map in Kraus form.
static QuantumChannel Depolarizing(double errorProbability)
Depolarizing channel in the NoiseModel/QCSim convention: (1-p)rho + p/3 (XrhoX + YrhoY + ZrhoZ).
static QuantumChannel PhaseDamping(double gamma)
Phase damping with coherence multiplier sqrt(1-gamma).
static QuantumChannel Pauli(double px, double py, double pz)
Single-qubit Pauli channel with X, Y and Z error probabilities.
static QuantumChannel AmplitudeDamping(double gamma)
|1> -> |0> relaxation with probability gamma.
static QuantumChannel GeneralizedAmplitudeDamping(double gamma, double excitedStatePopulation)
Finite-temperature amplitude damping.
static QuantumChannel DepolarizingMixing(double mixingProbability)
Depolarizing channel in the replacement convention: (1-p)rho + p I/2.
static QuantumChannel CorrelatedPhaseFlip(double probability)
(1-p)rho + p (Z (x) Z) rho (Z (x) Z).
static QuantumChannel BitPhaseFlip(double probability)
(1-p) rho + p Y rho Y.
static QuantumChannel ThermalRelaxation(double duration, double t1, double t2, double excitedStatePopulation=0.0)
Hardware-style thermal relaxation for a duration, T1 and T2.
static QuantumChannel TwoQubitDepolarizingMixing(double mixingProbability)
Two-qubit replacement depolarizing, fully mixed at probability one.
static QuantumChannel PhaseFlip(double probability)
(1-p) rho + p Z rho Z.
static QuantumChannel TwoQubitDepolarizing(double errorProbability)
Two-qubit depolarizing in the total-Pauli-error convention: identity has probability 1-p and each oth...
std::vector< Matrix > KrausOperators
static QuantumChannel BitFlip(double probability)
(1-p) rho + p X rho X.
size_t DenseSize(size_t qubits)
Bounded online routing based on current physical bond dimensions.
SimulationType
The type of simulation.
@ kExtendedStabilizer
Extended stabilizer simulation type.
@ kOther
other simulation type, could occur for the aer simulator, which also has unitary and superop methods
@ kStatevector
statevector simulation type
@ kMatrixProductState
matrix product state simulation type
@ kDensityMatrix
Density matrix simulation type.
@ kStabilizer
Clifford gates simulation type.
@ kMatrixProductOperator
Matrix product operator simulation type.
@ kPauliPropagator
Pauli propagator simulation type.
@ kTensorNetwork
Tensor network simulation type.
@ kPathIntegral
Path integral simulation type.
SimulatorType
The type of simulator.
@ kCompositeQCSim
composite qcsim simulator type
@ kQCSim
qcsim simulator type
@ kQiskitAer
qiskit aer simulator type
@ kQuestSim
quest simulator type
@ kDistMpiGpuSim
state distributed across MPI ranks/GPUs
@ kCompositeQiskitAer
composite qiskit aer simulator type
@ kDistGpuSim
state distributed across local GPUs
@ kGpuSim
gpu simulator type
bool IsDistributedGpuSimulator(SimulatorType type)
bool IsGpuSimulator(SimulatorType type)
std::vector< qubit_t > qubits_vector
The type of a vector of qubits.
uint_fast64_t qubit_t
The type of a qubit.
uint64_t Derive(uint64_t seed, uint64_t stream)