47 const bool hasMeasurementsOnlyAtEnd = !
dcirc->HasOpsAfterMeasurements();
49 const bool specialOptimizationForStatevector =
50 optimiseMultipleShots &&
52 hasMeasurementsOnlyAtEnd;
53 const bool specialOptimizationForMPS =
54 optimiseMultipleShots &&
56 hasMeasurementsOnlyAtEnd;
63 optSim->Configure(
"matrix_product_state_max_bond_dimension",
66 optSim->Configure(
"matrix_product_state_truncation_threshold",
74 if (optimiseMultipleShots) {
77 if (!specialOptimizationForStatevector && !specialOptimizationForMPS &&
83 std::shared_ptr<Circuits::MeasurementOperation<Time>> measurementsOp;
87 if (optimiseMultipleShots && hasMeasurementsOnlyAtEnd) {
88 bool isQiskitAer =
false;
94 measurementsOp =
dcirc->GetLastMeasurements(executed, isQiskitAer);
95 const auto &qbits = measurementsOp->GetQubits();
109 if (optimiseMultipleShots &&
110 (specialOptimizationForStatevector || hasMeasurementsOnlyAtEnd)) {
111 const auto &qbits = measurementsOp->GetQubits();
113 const auto sampleres =
optSim->SampleCounts(qbits,
curCnt);
115 for (
const auto &[mstate, cnt] : sampleres) {
116 measurementsOp->SetStateFromSample(mstate, state);
121 localRes[bits] += cnt;
127 for (
const auto &r : localRes)
res[r.first] += r.second;
133 for (
size_t i = 0; i <
curCnt; ++i) {
134 if (optimiseMultipleShots) {
135 if (i > 0)
optSim->RestoreState();
136 dcirc->ExecuteMeasurements(
optSim, state, executed);
139 if (i < curCnt1)
optSim->Reset();
151 for (
const auto &r : localRes)
res[r.first] += r.second;
160 const bool hasMeasurementsOnlyAtEnd = !
dcirc->HasOpsAfterMeasurements();
162 const bool specialOptimizationForStatevector =
163 optimiseMultipleShots &&
165 hasMeasurementsOnlyAtEnd;
166 const bool specialOptimizationForMPS =
167 optimiseMultipleShots &&
169 hasMeasurementsOnlyAtEnd;
172 optSim->SetMultithreading(
true);
178 optSim->Configure(
"matrix_product_state_max_bond_dimension",
181 optSim->Configure(
"matrix_product_state_truncation_threshold",
189 if (optimiseMultipleShots) {
192 if (!specialOptimizationForStatevector &&
193 !specialOptimizationForMPS &&
curCnt > 1)
199 bool needToExecuteGates =
true;
202 needToExecuteGates =
false;
206 if (needToExecuteGates && optimiseMultipleShots) {
208 if (!specialOptimizationForStatevector &&
209 !specialOptimizationForMPS &&
curCnt > 1)
217 optSim->SetMultithreading(
true);
220 optSim->Configure(
"matrix_product_state_max_bond_dimension",
223 optSim->Configure(
"matrix_product_state_truncation_threshold",
231 if (optimiseMultipleShots) {
234 if (!specialOptimizationForStatevector && !specialOptimizationForMPS &&
240 std::shared_ptr<Circuits::MeasurementOperation<Time>> measurementsOp;
244 if (optimiseMultipleShots && hasMeasurementsOnlyAtEnd) {
245 bool isQiskitAer =
false;
251 measurementsOp =
dcirc->GetLastMeasurements(executed, isQiskitAer);
252 const auto &qbits = measurementsOp->GetQubits();
263 if (optimiseMultipleShots &&
264 (specialOptimizationForStatevector || hasMeasurementsOnlyAtEnd)) {
265 const auto &qbits = measurementsOp->GetQubits();
267 const auto sampleres =
optSim->SampleCounts(qbits,
curCnt);
269 for (
const auto &[mstate, cnt] : sampleres) {
270 measurementsOp->SetStateFromSample(mstate, state);
284 for (
size_t i = 0; i <
curCnt; ++i) {
285 if (optimiseMultipleShots) {
286 if (i > 0)
optSim->RestoreState();
287 dcirc->ExecuteMeasurements(
optSim, state, executed);