Skip to content

Commit 1cf5adc

Browse files
authored
✨ Optionally disable measurements (#103)
This PR adds a new option `add_measurements_to_mapped_circuit` to the QMAP configuration that allows to specify whether measurements should be included in the final circuit or not (defaults to `True`). Using it is as simple as ```python3 from mqt import qmap qcMapped, result = qmap.compile(qc, arch, add_measurements_to_mapped_circuit=False) ``` Closes #102. Signed-off-by: Lukas Burgholzer <lukas.burgholzer@jku.at>
1 parent ce8bfda commit 1cf5adc

File tree

6 files changed

+65
-4
lines changed

6 files changed

+65
-4
lines changed

include/configuration/Configuration.hpp

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@ struct Configuration {
2323
bool preMappingOptimizations = true;
2424
bool postMappingOptimizations = true;
2525

26+
bool addMeasurementsToMappedCircuit = true;
27+
2628
bool verbose = false;
2729

2830
// map to particular subgraph of architecture (in exact mapper)
@@ -73,9 +75,10 @@ struct Configuration {
7375
if (!subgraph.empty()) {
7476
config["subgraph"] = subgraph;
7577
}
76-
config["pre_mapping_optimizations"] = preMappingOptimizations;
77-
config["post_mapping_optimizations"] = postMappingOptimizations;
78-
config["verbose"] = verbose;
78+
config["pre_mapping_optimizations"] = preMappingOptimizations;
79+
config["post_mapping_optimizations"] = postMappingOptimizations;
80+
config["add_measurements_to_mapped_circuit"] = addMeasurementsToMappedCircuit;
81+
config["verbose"] = verbose;
7982

8083
if (method == Method::Heuristic) {
8184
auto& heuristic = config["settings"];

mqt/qmap/bindings.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -177,6 +177,7 @@ PYBIND11_MODULE(pyqmap, m) {
177177
.def_readwrite("subgraph", &Configuration::subgraph)
178178
.def_readwrite("pre_mapping_optimizations", &Configuration::preMappingOptimizations)
179179
.def_readwrite("post_mapping_optimizations", &Configuration::postMappingOptimizations)
180+
.def_readwrite("add_measurements_to_mapped_circuit", &Configuration::addMeasurementsToMappedCircuit)
180181
.def("json", &Configuration::json)
181182
.def("__repr__", &Configuration::toString);
182183

mqt/qmap/compile.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ def compile(
7070
subgraph: Optional[Set[int]] = None,
7171
pre_mapping_optimizations: bool = True,
7272
post_mapping_optimizations: bool = True,
73+
add_measurements_to_mapped_circuit: bool = True,
7374
verbose: bool = False,
7475
) -> Tuple[QuantumCircuit, MappingResults]:
7576
"""Interface to the MQT QMAP tool for mapping quantum circuits
@@ -109,6 +110,8 @@ def compile(
109110
:type pre_mapping_optimizations: bool
110111
:param post_mapping_optimizations: Run post-mapping optimizations (default: True)
111112
:type post_mapping_optimizations: bool
113+
:param add_measurements_to_mapped_circuit: Whether to add measurements at the end of the mapped circuit (default: True)
114+
:type add_measurements_to_mapped_circuit: bool
112115
:param verbose: Print more detailed information during the mapping process
113116
:type verbose: bool
114117
:return: Mapped circuit (as Qiskit `QuantumCircuit`) and results
@@ -174,6 +177,7 @@ def compile(
174177
config.teleportation_seed = teleportation_seed
175178
config.pre_mapping_optimizations = pre_mapping_optimizations
176179
config.post_mapping_optimizations = post_mapping_optimizations
180+
config.add_measurements_to_mapped_circuit = add_measurements_to_mapped_circuit
177181
config.verbose = verbose
178182

179183
results = map(circ, architecture, config)

src/Mapper.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -158,7 +158,9 @@ void Mapper::finalizeMappedCircuit() {
158158
qcMapped.unifyQuantumRegisters();
159159

160160
// append measurements according to output permutation
161-
qcMapped.appendMeasurementsAccordingToOutputPermutation();
161+
if (results.config.addMeasurementsToMappedCircuit) {
162+
qcMapped.appendMeasurementsAccordingToOutputPermutation();
163+
}
162164
}
163165

164166
void Mapper::placeRemainingArchitectureQubits() {

test/test_exact.cpp

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -471,3 +471,21 @@ TEST_F(ExactTest, CommanderEncodingRigettiArch) {
471471

472472
SUCCEED() << "Mapping successful";
473473
}
474+
475+
TEST_F(ExactTest, NoMeasurmentsAdded) {
476+
// configure to not include measurements after mapping
477+
settings.addMeasurementsToMappedCircuit = false;
478+
479+
// perform the mapping
480+
IBMQ_London_mapper->map(settings);
481+
482+
// get the resulting circuit
483+
auto qcMapped = qc::QuantumComputation();
484+
std::stringstream qasm{};
485+
IBMQ_London_mapper->dumpResult(qasm, qc::OpenQASM);
486+
qcMapped.import(qasm, qc::OpenQASM);
487+
488+
// check no measurements were added
489+
EXPECT_EQ(qcMapped.getNops(), 4U);
490+
EXPECT_NE(qcMapped.back()->getType(), qc::Measure);
491+
}

test/test_heuristic.cpp

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,39 @@ TEST(Functionality, EmptyDump) {
4242
EXPECT_THROW(mapper.dumpResult("test.dummy"), QMAPException);
4343
}
4444

45+
TEST(Functionality, NoMeasurmentsAdded) {
46+
using namespace dd::literals;
47+
// construct circuit
48+
qc::QuantumComputation qc{4U};
49+
qc.x(1, 0_pc);
50+
qc.x(1, 2_pc);
51+
qc.x(1, 3_pc);
52+
53+
// load architecture
54+
Architecture arch{};
55+
arch.loadCouplingMap(AvailableArchitecture::IBMQ_London);
56+
57+
// create heuristic mapper
58+
HeuristicMapper mapper(qc, arch);
59+
60+
// configure to not include measurements after mapping
61+
auto config = Configuration{};
62+
config.addMeasurementsToMappedCircuit = false;
63+
64+
// perform the mapping
65+
mapper.map(config);
66+
67+
// get the resulting circuit
68+
auto qcMapped = qc::QuantumComputation();
69+
std::stringstream qasm{};
70+
mapper.dumpResult(qasm, qc::OpenQASM);
71+
qcMapped.import(qasm, qc::OpenQASM);
72+
73+
// check no measurements were added
74+
EXPECT_EQ(qcMapped.getNops(), 3U);
75+
EXPECT_NE(qcMapped.back()->getType(), qc::Measure);
76+
}
77+
4578
INSTANTIATE_TEST_SUITE_P(Heuristic, HeuristicTest5Q,
4679
testing::Values(
4780
"3_17_13",

0 commit comments

Comments
 (0)