48 const bool hasMeasurementsOnlyAtEnd = !
dcirc->HasOpsAfterMeasurements();
50 const bool specialOptimizationForStatevector =
51 optimiseMultipleShots &&
53 hasMeasurementsOnlyAtEnd;
54 const bool specialOptimizationForMPS =
55 optimiseMultipleShots &&
57 hasMeasurementsOnlyAtEnd;
64 optSim->Configure(
"matrix_product_state_max_bond_dimension",
67 optSim->Configure(
"matrix_product_state_truncation_threshold",
75 if (optimiseMultipleShots) {
78 if (!specialOptimizationForStatevector && !specialOptimizationForMPS &&
84 std::shared_ptr<Circuits::MeasurementOperation<Time>> measurementsOp;
88 if (optimiseMultipleShots && hasMeasurementsOnlyAtEnd) {
89 bool isQiskitAer =
false;
95 measurementsOp =
dcirc->GetLastMeasurements(executed, isQiskitAer);
96 const auto &qbits = measurementsOp->GetQubits();
110 if (optimiseMultipleShots &&
111 (specialOptimizationForStatevector || hasMeasurementsOnlyAtEnd)) {
112 const auto &qbits = measurementsOp->GetQubits();
114 const auto sampleres =
optSim->SampleCountsMany(qbits,
curCnt);
116 for (
const auto &[mstate, cnt] : sampleres) {
117 measurementsOp->SetStateFromSample(mstate, state);
122 localRes[bits] += cnt;
128 for (
const auto &r : localRes)
res[r.first] += r.second;
134 for (
size_t i = 0; i <
curCnt; ++i) {
135 if (optimiseMultipleShots) {
136 if (i > 0)
optSim->RestoreState();
137 dcirc->ExecuteMeasurements(
optSim, state, executed);
140 if (i < curCnt1)
optSim->Reset();
152 for (
const auto &r : localRes)
res[r.first] += r.second;
161 const bool hasMeasurementsOnlyAtEnd = !
dcirc->HasOpsAfterMeasurements();
163 const bool specialOptimizationForStatevector =
164 optimiseMultipleShots &&
166 hasMeasurementsOnlyAtEnd;
167 const bool specialOptimizationForMPS =
168 optimiseMultipleShots &&
170 hasMeasurementsOnlyAtEnd;
173 optSim->SetMultithreading(
true);
179 optSim->Configure(
"matrix_product_state_max_bond_dimension",
182 optSim->Configure(
"matrix_product_state_truncation_threshold",
190 if (optimiseMultipleShots) {
193 if (!specialOptimizationForStatevector &&
194 !specialOptimizationForMPS &&
curCnt > 1)
200 bool needToExecuteGates =
true;
203 needToExecuteGates =
false;
207 if (needToExecuteGates && optimiseMultipleShots) {
209 if (!specialOptimizationForStatevector &&
210 !specialOptimizationForMPS &&
curCnt > 1)
218 optSim->SetMultithreading(
true);
221 optSim->Configure(
"matrix_product_state_max_bond_dimension",
224 optSim->Configure(
"matrix_product_state_truncation_threshold",
232 if (optimiseMultipleShots) {
235 if (!specialOptimizationForStatevector && !specialOptimizationForMPS &&
241 std::shared_ptr<Circuits::MeasurementOperation<Time>> measurementsOp;
245 if (optimiseMultipleShots && hasMeasurementsOnlyAtEnd) {
246 bool isQiskitAer =
false;
252 measurementsOp =
dcirc->GetLastMeasurements(executed, isQiskitAer);
253 const auto &qbits = measurementsOp->GetQubits();
264 if (optimiseMultipleShots &&
265 (specialOptimizationForStatevector || hasMeasurementsOnlyAtEnd)) {
266 const auto &qbits = measurementsOp->GetQubits();
268 const auto sampleres =
optSim->SampleCountsMany(qbits,
curCnt);
270 for (
const auto &[mstate, cnt] : sampleres) {
271 measurementsOp->SetStateFromSample(mstate, state);
285 for (
size_t i = 0; i <
curCnt; ++i) {
286 if (optimiseMultipleShots) {
287 if (i > 0)
optSim->RestoreState();
288 dcirc->ExecuteMeasurements(
optSim, state, executed);