Skip to content

Commit

Permalink
✨ Optionally disable measurements (#103)
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
burgholzer authored Sep 7, 2022
1 parent ce8bfda commit 1cf5adc
Show file tree
Hide file tree
Showing 6 changed files with 65 additions and 4 deletions.
9 changes: 6 additions & 3 deletions include/configuration/Configuration.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,8 @@ struct Configuration {
bool preMappingOptimizations = true;
bool postMappingOptimizations = true;

bool addMeasurementsToMappedCircuit = true;

bool verbose = false;

// map to particular subgraph of architecture (in exact mapper)
Expand Down Expand Up @@ -73,9 +75,10 @@ struct Configuration {
if (!subgraph.empty()) {
config["subgraph"] = subgraph;
}
config["pre_mapping_optimizations"] = preMappingOptimizations;
config["post_mapping_optimizations"] = postMappingOptimizations;
config["verbose"] = verbose;
config["pre_mapping_optimizations"] = preMappingOptimizations;
config["post_mapping_optimizations"] = postMappingOptimizations;
config["add_measurements_to_mapped_circuit"] = addMeasurementsToMappedCircuit;
config["verbose"] = verbose;

if (method == Method::Heuristic) {
auto& heuristic = config["settings"];
Expand Down
1 change: 1 addition & 0 deletions mqt/qmap/bindings.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -177,6 +177,7 @@ PYBIND11_MODULE(pyqmap, m) {
.def_readwrite("subgraph", &Configuration::subgraph)
.def_readwrite("pre_mapping_optimizations", &Configuration::preMappingOptimizations)
.def_readwrite("post_mapping_optimizations", &Configuration::postMappingOptimizations)
.def_readwrite("add_measurements_to_mapped_circuit", &Configuration::addMeasurementsToMappedCircuit)
.def("json", &Configuration::json)
.def("__repr__", &Configuration::toString);

Expand Down
4 changes: 4 additions & 0 deletions mqt/qmap/compile.py
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,7 @@ def compile(
subgraph: Optional[Set[int]] = None,
pre_mapping_optimizations: bool = True,
post_mapping_optimizations: bool = True,
add_measurements_to_mapped_circuit: bool = True,
verbose: bool = False,
) -> Tuple[QuantumCircuit, MappingResults]:
"""Interface to the MQT QMAP tool for mapping quantum circuits
Expand Down Expand Up @@ -109,6 +110,8 @@ def compile(
:type pre_mapping_optimizations: bool
:param post_mapping_optimizations: Run post-mapping optimizations (default: True)
:type post_mapping_optimizations: bool
:param add_measurements_to_mapped_circuit: Whether to add measurements at the end of the mapped circuit (default: True)
:type add_measurements_to_mapped_circuit: bool
:param verbose: Print more detailed information during the mapping process
:type verbose: bool
:return: Mapped circuit (as Qiskit `QuantumCircuit`) and results
Expand Down Expand Up @@ -174,6 +177,7 @@ def compile(
config.teleportation_seed = teleportation_seed
config.pre_mapping_optimizations = pre_mapping_optimizations
config.post_mapping_optimizations = post_mapping_optimizations
config.add_measurements_to_mapped_circuit = add_measurements_to_mapped_circuit
config.verbose = verbose

results = map(circ, architecture, config)
Expand Down
4 changes: 3 additions & 1 deletion src/Mapper.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -158,7 +158,9 @@ void Mapper::finalizeMappedCircuit() {
qcMapped.unifyQuantumRegisters();

// append measurements according to output permutation
qcMapped.appendMeasurementsAccordingToOutputPermutation();
if (results.config.addMeasurementsToMappedCircuit) {
qcMapped.appendMeasurementsAccordingToOutputPermutation();
}
}

void Mapper::placeRemainingArchitectureQubits() {
Expand Down
18 changes: 18 additions & 0 deletions test/test_exact.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -471,3 +471,21 @@ TEST_F(ExactTest, CommanderEncodingRigettiArch) {

SUCCEED() << "Mapping successful";
}

TEST_F(ExactTest, NoMeasurmentsAdded) {
// configure to not include measurements after mapping
settings.addMeasurementsToMappedCircuit = false;

// perform the mapping
IBMQ_London_mapper->map(settings);

// get the resulting circuit
auto qcMapped = qc::QuantumComputation();
std::stringstream qasm{};
IBMQ_London_mapper->dumpResult(qasm, qc::OpenQASM);
qcMapped.import(qasm, qc::OpenQASM);

// check no measurements were added
EXPECT_EQ(qcMapped.getNops(), 4U);
EXPECT_NE(qcMapped.back()->getType(), qc::Measure);
}
33 changes: 33 additions & 0 deletions test/test_heuristic.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,39 @@ TEST(Functionality, EmptyDump) {
EXPECT_THROW(mapper.dumpResult("test.dummy"), QMAPException);
}

TEST(Functionality, NoMeasurmentsAdded) {
using namespace dd::literals;
// construct circuit
qc::QuantumComputation qc{4U};
qc.x(1, 0_pc);
qc.x(1, 2_pc);
qc.x(1, 3_pc);

// load architecture
Architecture arch{};
arch.loadCouplingMap(AvailableArchitecture::IBMQ_London);

// create heuristic mapper
HeuristicMapper mapper(qc, arch);

// configure to not include measurements after mapping
auto config = Configuration{};
config.addMeasurementsToMappedCircuit = false;

// perform the mapping
mapper.map(config);

// get the resulting circuit
auto qcMapped = qc::QuantumComputation();
std::stringstream qasm{};
mapper.dumpResult(qasm, qc::OpenQASM);
qcMapped.import(qasm, qc::OpenQASM);

// check no measurements were added
EXPECT_EQ(qcMapped.getNops(), 3U);
EXPECT_NE(qcMapped.back()->getType(), qc::Measure);
}

INSTANTIATE_TEST_SUITE_P(Heuristic, HeuristicTest5Q,
testing::Values(
"3_17_13",
Expand Down

0 comments on commit 1cf5adc

Please sign in to comment.