Skip to content

Commit 4aca639

Browse files
committed
Added support for ClassicControlledOperation
1 parent c04195b commit 4aca639

File tree

5 files changed

+35
-8
lines changed

5 files changed

+35
-8
lines changed

extern/googletest

Submodule googletest updated 62 files

extern/qfr

Submodule qfr updated from 27b60fb to 86875fe

src/QFRSimulator.cpp

+16-5
Original file line numberDiff line numberDiff line change
@@ -11,16 +11,16 @@ void QFRSimulator::Simulate() {
1111

1212
unsigned long op_num = 0;
1313

14-
std::map<unsigned int, bool> classic_values;
14+
std::map<int, bool> classic_values;
1515

1616
for (auto& op : *qc) {
17-
if (!op->isUnitary()) {
18-
if(auto* nu_op = dynamic_cast<qc::NonUnitaryOperation*>(op.get())) {
19-
if (nu_op->getName()[0] == 'M') {
17+
if (op->isNonUnitaryOperation()) {
18+
if (auto *nu_op = dynamic_cast<qc::NonUnitaryOperation *>(op.get())) {
19+
if (nu_op->getName()[0] == 'M') { // Measure starts with 'M', quite hacky though
2020
auto quantum = nu_op->getControls();
2121
auto classic = nu_op->getTargets();
2222

23-
if(quantum.size() != classic.size()) {
23+
if (quantum.size() != classic.size()) {
2424
std::cerr << "[ERROR] Measurement: Sizes of quantum and classic register mismatch.\n";
2525
std::exit(1);
2626
}
@@ -40,6 +40,17 @@ void QFRSimulator::Simulate() {
4040
}
4141
dd->garbageCollect();
4242
} else {
43+
if (op->isClassicControlledOperation()) {
44+
if (auto *cc_op = dynamic_cast<qc::ClassicControlledOperation *>(op.get())) {
45+
auto classic_bit_index = static_cast<short>(cc_op->getParameter().at(0)); // fp -> short *argh*
46+
if (!classic_values[classic_bit_index]) {
47+
continue;
48+
}
49+
} else {
50+
std::cerr << "[ERROR] Dynamic cast to ClassicControlledOperation failed." << std::endl;
51+
std::exit(1);
52+
}
53+
}
4354
//std::clog << "[INFO] op " << op_num++ << " is " << op->getName()
4455
// << " #controls=" << op->getControls().size()
4556
// << " statesize=" << dd->size(root_edge) << "\n";

test/test_simple.cpp

+16
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,22 @@ TEST(SimulatorTest, SingleOneQubitGateOnTwoQubitCircuit) {
1414
ASSERT_EQ("01", m);
1515
}
1616

17+
TEST(SimulatorTest, ClassicControlledOp) {
18+
auto quantumComputation = std::make_unique<qc::QuantumComputation>(2);
19+
quantumComputation->emplace_back<qc::StandardOperation>(2, 0, qc::X);
20+
std::vector<unsigned short> qubit_to_measure = {0};
21+
quantumComputation->emplace_back<qc::NonUnitaryOperation>(2, qubit_to_measure, qubit_to_measure);
22+
std::unique_ptr<qc::Operation> op (new qc::StandardOperation(2, 1, qc::X));
23+
quantumComputation->emplace_back<qc::ClassicControlledOperation>(op, 0);
24+
25+
QFRSimulator ddsim(quantumComputation);
26+
ddsim.Simulate();
27+
28+
auto m = ddsim.MeasureAll(false);
29+
30+
ASSERT_EQ("11", m);
31+
}
32+
1733

1834
TEST(SimulatorTest, DestructiveMeasurementAll) {
1935
auto quantumComputation = std::make_unique<qc::QuantumComputation>(2);

0 commit comments

Comments
 (0)