20template <
typename Time = Types::time_type>
class ExecuteJob {
40 const bool hasMeasurementsOnlyAtEnd = !
dcirc->HasOpsAfterMeasurements();
42 const bool specialOptimizationForStatevector =
43 optimiseMultipleShots &&
45 hasMeasurementsOnlyAtEnd;
46 const bool specialOptimizationForMPS =
47 optimiseMultipleShots &&
49 hasMeasurementsOnlyAtEnd;
57 optSim->Configure(
"matrix_product_state_max_bond_dimension",
60 optSim->Configure(
"matrix_product_state_truncation_threshold",
68 if (optimiseMultipleShots) {
71 if (!specialOptimizationForStatevector && !specialOptimizationForMPS)
76 std::shared_ptr<Circuits::MeasurementOperation<Time>> measurementsOp;
80 if (optimiseMultipleShots && hasMeasurementsOnlyAtEnd) {
81 measurementsOp =
dcirc->GetLastMeasurements(
84 const auto &qbits = measurementsOp->GetQubits();
98 if (optimiseMultipleShots &&
99 (specialOptimizationForStatevector || hasMeasurementsOnlyAtEnd)) {
100 const auto &qbits = measurementsOp->GetQubits();
102 const auto sampleres =
optSim->SampleCounts(qbits,
curCnt);
104 for (
const auto &[mstate, cnt] : sampleres) {
105 measurementsOp->SetStateFromSample(mstate, state);
110 localRes[bits] += cnt;
116 for (
const auto &r : localRes)
117 res[r.first] += r.second;
123 for (
size_t i = 0; i <
curCnt; ++i) {
124 if (optimiseMultipleShots) {
126 dcirc->ExecuteMeasurements(
optSim, state, executed);
142 for (
const auto &r : localRes)
143 res[r.first] += r.second;
153 const bool hasMeasurementsOnlyAtEnd = !
dcirc->HasOpsAfterMeasurements();
155 const bool specialOptimizationForStatevector =
156 optimiseMultipleShots &&
158 hasMeasurementsOnlyAtEnd;
159 const bool specialOptimizationForMPS =
160 optimiseMultipleShots &&
162 hasMeasurementsOnlyAtEnd;
165 optSim->SetMultithreading(
true);
171 optSim->Configure(
"matrix_product_state_max_bond_dimension",
174 optSim->Configure(
"matrix_product_state_truncation_threshold",
182 if (optimiseMultipleShots) {
185 if (!specialOptimizationForStatevector && !specialOptimizationForMPS)
194 optSim->SetMultithreading(
true);
197 optSim->Configure(
"matrix_product_state_max_bond_dimension",
200 optSim->Configure(
"matrix_product_state_truncation_threshold",
208 if (optimiseMultipleShots) {
211 if (!specialOptimizationForStatevector && !specialOptimizationForMPS)
216 std::shared_ptr<Circuits::MeasurementOperation<Time>> measurementsOp;
220 if (optimiseMultipleShots && hasMeasurementsOnlyAtEnd) {
221 measurementsOp =
dcirc->GetLastMeasurements(
224 const auto &qbits = measurementsOp->GetQubits();
235 if (optimiseMultipleShots &&
236 (specialOptimizationForStatevector || hasMeasurementsOnlyAtEnd)) {
237 const auto &qbits = measurementsOp->GetQubits();
239 const auto sampleres =
optSim->SampleCounts(qbits,
curCnt);
241 for (
const auto &[mstate, cnt] : sampleres) {
242 measurementsOp->SetStateFromSample(mstate, state);
256 for (
size_t i = 0; i <
curCnt; ++i) {
257 if (optimiseMultipleShots) {
259 dcirc->ExecuteMeasurements(
optSim, state, executed);
282 const std::shared_ptr<Circuits::Circuit<Time>>
dcirc;
294 std::shared_ptr<Simulators::ISimulator>
optSim;
Circuit class for holding the sequence of operations.
std::unordered_map< std::vector< bool >, size_t > ExecuteResults
The results of the execution of the circuit.
The state class that stores the classical state of a quantum circuit execution.
void Reset(bool value=false)
Set the classical bits with the specified value.
const std::vector< bool > & GetAllBits() const
Get the classical bits.
void AllocateBits(size_t numBits)
Allocate more bits.
bool optimiseMultipleShotsExecution
static bool IsOptimisableForMultipleShots(Simulators::SimulatorType t, size_t curCnt)
const Simulators::SimulatorType simType
std::vector< bool > executedGates
typename Circuits::Circuit< Time >::ExecuteResults ExecuteResults
const size_t nrResultCbits
ExecuteJob(const std::shared_ptr< Circuits::Circuit< Time > > &c, ExecuteResults &r, size_t cnt, size_t nq, size_t nc, size_t ncr, Simulators::SimulatorType t, Simulators::SimulationType m, std::mutex &mut)
const std::shared_ptr< Circuits::Circuit< Time > > dcirc
std::shared_ptr< Simulators::ISimulator > optSim
std::mutex & resultsMutex
const Simulators::SimulationType method
std::string singularValueThreshold
size_t GetJobCount() const
static std::shared_ptr< ISimulator > CreateSimulator(SimulatorType t=SimulatorType::kQCSim, SimulationType method=SimulationType::kMatrixProductState)
Create a quantum computing simulator.
SimulationType
The type of simulation.
@ kStatevector
statevector simulation type
@ kMatrixProductState
matrix product state simulation type
SimulatorType
The type of simulator.
@ kQiskitAer
qiskit aer simulator type