Skip to content

Commit 97e4f9b

Browse files
committed
Now swaps optimization work from the networks, too (there was an issue preventing it to work correctly)
1 parent f4236d7 commit 97e4f9b

2 files changed

Lines changed: 39 additions & 22 deletions

File tree

Network/NetworkJob.h

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,6 @@ class ExecuteJob {
7979
optSim->Initialize();
8080

8181
OptimizeMPSInitialQubitsMap(optSim, dcirc, nrQubits);
82-
optSim->SetUpcomingGates(dcirc->GetOperations());
8382

8483
if (optimiseMultipleShots) {
8584
executedGates = dcirc->ExecuteNonMeasurements(optSim, state);
@@ -89,7 +88,8 @@ class ExecuteJob {
8988
optSim->SaveState();
9089

9190
dcirc = dcirc->RemoveExecutedOperations(executedGates);
92-
optSim->SetUpcomingGates(dcirc->GetOperations());
91+
if (network->GetMPSOptimizeSwaps())
92+
optSim->SetUpcomingGates(dcirc->GetOperations());
9393
}
9494
}
9595

@@ -207,7 +207,6 @@ class ExecuteJob {
207207
optSim->Initialize();
208208

209209
OptimizeMPSInitialQubitsMap(optSim, dcirc, nrQubits);
210-
optSim->SetUpcomingGates(dcirc->GetOperations());
211210

212211
if (optimiseMultipleShots) {
213212
executedGates = dcirc->ExecuteNonMeasurements(optSim, state);
@@ -216,7 +215,8 @@ class ExecuteJob {
216215
!specialOptimizationForMPS && curCnt > 1)
217216
optSim->SaveState();
218217
dcirc = dcirc->RemoveExecutedOperations(executedGates);
219-
optSim->SetUpcomingGates(dcirc->GetOperations());
218+
if (network->GetMPSOptimizeSwaps())
219+
optSim->SetUpcomingGates(dcirc->GetOperations());
220220
}
221221
} else if (executedGates.size() == dcirc->size()) {
222222
// special case for when the simulator is passed from the network
@@ -262,7 +262,6 @@ class ExecuteJob {
262262
optSim->Initialize();
263263

264264
OptimizeMPSInitialQubitsMap(optSim, dcirc, nrQubits);
265-
optSim->SetUpcomingGates(dcirc->GetOperations());
266265

267266
if (optimiseMultipleShots) {
268267
executedGates = dcirc->ExecuteNonMeasurements(optSim, state);
@@ -272,7 +271,8 @@ class ExecuteJob {
272271
optSim->SaveState();
273272

274273
dcirc = dcirc->RemoveExecutedOperations(executedGates);
275-
optSim->SetUpcomingGates(dcirc->GetOperations());
274+
if (network->GetMPSOptimizeSwaps())
275+
optSim->SetUpcomingGates(dcirc->GetOperations());
276276
}
277277
}
278278

@@ -374,16 +374,15 @@ class ExecuteJob {
374374
Simulators::MPSDummySimulator dummySim(nrQubits);
375375
if (!maxBondDim.empty())
376376
dummySim.SetMaxBondDimension(maxBondDimValue);
377-
const auto optimalMap = dummySim.ComputeOptimalQubitsMap(layers);
378-
379-
if (network->GetInitialQubitsMapOptimization())
377+
378+
if (network->GetInitialQubitsMapOptimization()) {
379+
const auto optimalMap = dummySim.ComputeOptimalQubitsMap(layers);
380380
sim->SetInitialQubitsMap(optimalMap);
381+
}
381382

382383
dcirc = Circuits::Circuit<Time>::LayersToCircuit(layers);
383384

384385
if (network->GetMPSOptimizeSwaps()) {
385-
sim->SetUpcomingGates(dcirc->GetOperations());
386-
387386
// TODO: come up with something better!
388387
int lookaheadVal = nrQubits;
389388
if (nrQubits > 15) lookaheadVal = 15;
@@ -399,8 +398,11 @@ class ExecuteJob {
399398
? lookaheadDepth - 1
400399
: lookaheadDepth - 2;
401400

401+
sim->SetUseOptimalMeetingPosition(true);
402402
sim->SetLookaheadDepth(lookaheadDepth);
403403
sim->SetLookaheadDepthWithHeuristic(lookaheadHeuristicDepth);
404+
405+
sim->SetUpcomingGates(dcirc->GetOperations());
404406
}
405407
}
406408
}

Network/SimpleDisconnectedNetwork.h

Lines changed: 26 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2133,45 +2133,60 @@ class SimpleDisconnectedNetwork : public INetwork<Time> {
21332133
(optimizeInitialQubitsMap || mpsOptimizeSwaps) &&
21342134
sim->SupportsMPSSwapOptimization()) {
21352135
if (mpsOptimizationQubitsNumberThreshold <= nrQubits) {
2136-
const auto bondDimThreshold = mpsOptimizationBondDimensionThreshold;
21372136
const auto maxBondDimValue =
21382137
maxBondDim.empty() ? 0 : std::stoi(maxBondDim);
21392138

2140-
if (maxBondDim.empty() || bondDimThreshold <= maxBondDimValue) {
2139+
if (maxBondDim.empty() ||
2140+
mpsOptimizationBondDimensionThreshold <= maxBondDimValue) {
21412141
// need to be sure the circuit is correctly converted
21422142
dcirc->ConvertForCutting(); // convert the three qubit gates
21432143
auto layers = dcirc->ToMultipleQubitsLayersNoClone();
21442144

2145+
double avgTwoQubitGatesPerLayer = 0.0;
2146+
for (const auto &layer : layers) {
2147+
int twoQubitGates = 0;
2148+
for (const auto &op : layer->GetOperations()) {
2149+
if (op->AffectedQubits().size() >= 2) {
2150+
++twoQubitGates;
2151+
}
2152+
}
2153+
avgTwoQubitGatesPerLayer += twoQubitGates;
2154+
}
2155+
avgTwoQubitGatesPerLayer /= layers.size();
2156+
21452157
Simulators::MPSDummySimulator dummySim(nrQubits);
21462158
if (!maxBondDim.empty())
21472159
dummySim.SetMaxBondDimension(maxBondDimValue);
2148-
const auto optimalMap = dummySim.ComputeOptimalQubitsMap(layers);
21492160

2150-
if (optimizeInitialQubitsMap) sim->SetInitialQubitsMap(optimalMap);
2161+
if (optimizeInitialQubitsMap) {
2162+
const auto optimalMap = dummySim.ComputeOptimalQubitsMap(layers);
2163+
sim->SetInitialQubitsMap(optimalMap);
2164+
}
21512165

21522166
auto optCirc = Circuits::Circuit<Time>::LayersToCircuit(layers);
21532167
dcirc->SetOperations(optCirc->GetOperations());
21542168

21552169
if (mpsOptimizeSwaps) {
2156-
sim->SetUpcomingGates(dcirc->GetOperations());
2157-
21582170
// TODO: come up with something better!
2159-
int lookaheadVal = nrQubits;
2160-
if (nrQubits > 15) lookaheadVal = 15;
2171+
int lookaheadVal = static_cast<int>(4. * avgTwoQubitGatesPerLayer);
2172+
if (lookaheadVal > 15) lookaheadVal = 15;
21612173

2162-
const int lookaheadDepth = layers.size() < 10 ? 5
2174+
const int lookaheadDepth = layers.size() < 10 ? 0
21632175
: layers.size() < 20
21642176
? static_cast<int>(lookaheadVal)
21652177
: layers.size() < 35 ? 1.5 * lookaheadVal
21662178
: 2 * lookaheadVal;
21672179

2168-
const int lookaheadHeuristicDepth = layers.size() < 10 ? 4
2180+
const int lookaheadHeuristicDepth = layers.size() < 10 ? 0
21692181
: layers.size() < 20
21702182
? lookaheadDepth - 1
2171-
: lookaheadDepth - 2;
2183+
: lookaheadDepth - 2;
21722184

2185+
sim->SetUseOptimalMeetingPosition(true);
21732186
sim->SetLookaheadDepth(lookaheadDepth);
21742187
sim->SetLookaheadDepthWithHeuristic(lookaheadHeuristicDepth);
2188+
2189+
sim->SetUpcomingGates(dcirc->GetOperations());
21752190
}
21762191
}
21772192
}

0 commit comments

Comments
 (0)