Skip to content
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 6 additions & 1 deletion quisp/backends/interfaces/IQubit.h
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,13 @@ enum class EigenvalueResult : int {
PLUS_ONE,
MINUS_ONE,
};
enum Basis{
X,
Y,
Z,
};
struct MeasurementOutcome {
char basis;
Basis basis;
bool outcome_is_plus;
char GOD_clean;
bool operator==(const MeasurementOutcome &outcome) const { return basis == outcome.basis && outcome_is_plus == outcome.outcome_is_plus && GOD_clean == outcome.GOD_clean; }
Expand Down
6 changes: 3 additions & 3 deletions quisp/modules/QNIC/StationaryQubit/StationaryQubit.cc
Original file line number Diff line number Diff line change
Expand Up @@ -250,13 +250,13 @@ MeasurementOutcome StationaryQubit::measureRandomPauliBasis() {
auto outcome = MeasurementOutcome();
if (rand < 1.0 / 3) {
outcome.outcome_is_plus = qubit_ref->measureX() == EigenvalueResult::PLUS_ONE;
outcome.basis = 'X';
outcome.basis = backends::abstract::Basis::X;
} else if (rand < 2.0 / 3) {
outcome.outcome_is_plus = qubit_ref->measureY() == EigenvalueResult::PLUS_ONE;
outcome.basis = 'Y';
outcome.basis = backends::abstract::Basis::Y;
} else {
outcome.outcome_is_plus = qubit_ref->measureZ() == EigenvalueResult::PLUS_ONE;
outcome.basis = 'Z';
outcome.basis = backends::abstract::Basis::Z;
}
outcome.GOD_clean = 'F'; // need to fix this to properly track the error
return outcome;
Expand Down
6 changes: 3 additions & 3 deletions quisp/modules/QRSA/RuleEngine/RuntimeCallback.h
Original file line number Diff line number Diff line change
Expand Up @@ -30,17 +30,17 @@ struct RuntimeCallback : public quisp::runtime::Runtime::ICallBack {

MeasurementOutcome measureQubitX(IQubitRecord *qubit_rec) override {
auto qubit = provider.getStationaryQubit(qubit_rec);
return MeasurementOutcome{.basis = 'X', .outcome_is_plus = qubit->measureX() == types::EigenvalueResult::PLUS_ONE};
return MeasurementOutcome{.basis = backends::abstract::Basis::X, .outcome_is_plus = qubit->measureX() == types::EigenvalueResult::PLUS_ONE};
}

MeasurementOutcome measureQubitZ(IQubitRecord *qubit_rec) override {
auto qubit = provider.getStationaryQubit(qubit_rec);
return MeasurementOutcome{.basis = 'Z', .outcome_is_plus = qubit->measureZ() == types::EigenvalueResult::PLUS_ONE};
return MeasurementOutcome{.basis = backends::abstract::Basis::Z, .outcome_is_plus = qubit->measureZ() == types::EigenvalueResult::PLUS_ONE};
}

MeasurementOutcome measureQubitY(IQubitRecord *qubit_rec) override {
auto qubit = provider.getStationaryQubit(qubit_rec);
return MeasurementOutcome{.basis = 'Y', .outcome_is_plus = qubit->measureY() == types::EigenvalueResult::PLUS_ONE};
return MeasurementOutcome{.basis = backends::abstract::Basis::Y, .outcome_is_plus = qubit->measureY() == types::EigenvalueResult::PLUS_ONE};
}

void gateX(IQubitRecord *qubit_rec) override {
Expand Down
24 changes: 12 additions & 12 deletions quisp/rules/Action_execution_test.cc
Original file line number Diff line number Diff line change
Expand Up @@ -94,17 +94,17 @@ TEST_F(ActionExecutionTest, Tomography) {
runtime->assignQubitToRuleSet(partner_addr, qubit1);
ASSERT_EQ(getResourceSizeByRuleId(*runtime, 0), 1);
EXPECT_CALL(*callback, freeAndResetQubit(qubit1)).Times(1);
EXPECT_CALL(*callback, measureQubitRandomly(qubit1)).Times(1).WillOnce(Return(MeasurementOutcome{.basis = 'X', .outcome_is_plus = true}));
EXPECT_CALL(*callback, sendLinkTomographyResult(ruleset_id, _, 0, QNodeAddr(partner_addr), 1, MeasurementOutcome{.basis = 'X', .outcome_is_plus = true}, 500, _)).Times(1);
EXPECT_CALL(*callback, measureQubitRandomly(qubit1)).Times(1).WillOnce(Return(MeasurementOutcome{.basis = quisp::backends::abstract::Basis::X, .outcome_is_plus = true}));
EXPECT_CALL(*callback, sendLinkTomographyResult(ruleset_id, _, 0, QNodeAddr(partner_addr), 1, MeasurementOutcome{.basis = quisp::backends::abstract::Basis::X, .outcome_is_plus = true}, 500, _)).Times(1);
runtime->exec();
ASSERT_EQ(getResourceSizeByRuleId(*runtime, 0), 0);

runtime->terminated = false;
runtime->assignQubitToRuleSet(partner_addr, qubit2);
ASSERT_EQ(getResourceSizeByRuleId(*runtime, 0), 1);
EXPECT_CALL(*callback, freeAndResetQubit(qubit2)).Times(1);
EXPECT_CALL(*callback, measureQubitRandomly(qubit2)).Times(1).WillOnce(Return(MeasurementOutcome{.basis = 'Z', .outcome_is_plus = false}));
EXPECT_CALL(*callback, sendLinkTomographyResult(ruleset_id, _, 0, QNodeAddr(partner_addr), 2, MeasurementOutcome{.basis = 'Z', .outcome_is_plus = false}, 500, _)).Times(1);
EXPECT_CALL(*callback, measureQubitRandomly(qubit2)).Times(1).WillOnce(Return(MeasurementOutcome{.basis = quisp::backends::abstract::Basis::Z, .outcome_is_plus = false}));
EXPECT_CALL(*callback, sendLinkTomographyResult(ruleset_id, _, 0, QNodeAddr(partner_addr), 2, MeasurementOutcome{.basis = quisp::backends::abstract::Basis::Z, .outcome_is_plus = false}, 500, _)).Times(1);
runtime->exec();
ASSERT_EQ(getResourceSizeByRuleId(*runtime, 0), 0);
}
Expand All @@ -121,8 +121,8 @@ TEST_F(ActionExecutionTest, Swapping) {
finalizeRuleset();

EXPECT_CALL(*callback, gateCNOT(qubit1, qubit2)).Times(1);
EXPECT_CALL(*callback, measureQubitX(qubit1)).Times(1).WillOnce(Return(MeasurementOutcome{.basis = 'X', .outcome_is_plus = true}));
EXPECT_CALL(*callback, measureQubitZ(qubit2)).Times(1).WillOnce(Return(MeasurementOutcome{.basis = 'Z', .outcome_is_plus = true}));
EXPECT_CALL(*callback, measureQubitX(qubit1)).Times(1).WillOnce(Return(MeasurementOutcome{.basis = quisp::backends::abstract::Basis::X, .outcome_is_plus = true}));
EXPECT_CALL(*callback, measureQubitZ(qubit2)).Times(1).WillOnce(Return(MeasurementOutcome{.basis = quisp::backends::abstract::Basis::Z, .outcome_is_plus = true}));
EXPECT_CALL(*callback, freeAndResetQubit(qubit1)).Times(1);
EXPECT_CALL(*callback, freeAndResetQubit(qubit2)).Times(1);
EXPECT_CALL(*callback, sendSwappingResult(ruleset_id, QNodeAddr{left_partner_addr}, QNodeAddr{right_partner_addr}, 123, 1, 0b00)).Times(1);
Expand All @@ -136,8 +136,8 @@ TEST_F(ActionExecutionTest, Swapping) {

runtime->terminated = false;
EXPECT_CALL(*callback, gateCNOT(qubit1, qubit2)).Times(1);
EXPECT_CALL(*callback, measureQubitX(qubit1)).Times(1).WillOnce(Return(MeasurementOutcome{.basis = 'X', .outcome_is_plus = false}));
EXPECT_CALL(*callback, measureQubitZ(qubit2)).Times(1).WillOnce(Return(MeasurementOutcome{.basis = 'Z', .outcome_is_plus = false}));
EXPECT_CALL(*callback, measureQubitX(qubit1)).Times(1).WillOnce(Return(MeasurementOutcome{.basis = quisp::backends::abstract::Basis::X, .outcome_is_plus = false}));
EXPECT_CALL(*callback, measureQubitZ(qubit2)).Times(1).WillOnce(Return(MeasurementOutcome{.basis = quisp::backends::abstract::Basis::Z, .outcome_is_plus = false}));
EXPECT_CALL(*callback, freeAndResetQubit(qubit1)).Times(1);
EXPECT_CALL(*callback, freeAndResetQubit(qubit2)).Times(1);
EXPECT_CALL(*callback, sendSwappingResult(ruleset_id, QNodeAddr{left_partner_addr}, QNodeAddr{right_partner_addr}, 123, 2, 0b11)).Times(1);
Expand All @@ -151,8 +151,8 @@ TEST_F(ActionExecutionTest, Swapping) {

runtime->terminated = false;
EXPECT_CALL(*callback, gateCNOT(qubit1, qubit2)).Times(1);
EXPECT_CALL(*callback, measureQubitX(qubit1)).Times(1).WillOnce(Return(MeasurementOutcome{.basis = 'X', .outcome_is_plus = true}));
EXPECT_CALL(*callback, measureQubitZ(qubit2)).Times(1).WillOnce(Return(MeasurementOutcome{.basis = 'Z', .outcome_is_plus = false}));
EXPECT_CALL(*callback, measureQubitX(qubit1)).Times(1).WillOnce(Return(MeasurementOutcome{.basis = quisp::backends::abstract::Basis::X, .outcome_is_plus = true}));
EXPECT_CALL(*callback, measureQubitZ(qubit2)).Times(1).WillOnce(Return(MeasurementOutcome{.basis = quisp::backends::abstract::Basis::Z, .outcome_is_plus = false}));
EXPECT_CALL(*callback, freeAndResetQubit(qubit1)).Times(1);
EXPECT_CALL(*callback, freeAndResetQubit(qubit2)).Times(1);
EXPECT_CALL(*callback, sendSwappingResult(ruleset_id, QNodeAddr{left_partner_addr}, QNodeAddr{right_partner_addr}, 123, 3, 0b10)).Times(1);
Expand All @@ -166,8 +166,8 @@ TEST_F(ActionExecutionTest, Swapping) {

runtime->terminated = false;
EXPECT_CALL(*callback, gateCNOT(qubit1, qubit2)).Times(1);
EXPECT_CALL(*callback, measureQubitX(qubit1)).Times(1).WillOnce(Return(MeasurementOutcome{.basis = 'X', .outcome_is_plus = false}));
EXPECT_CALL(*callback, measureQubitZ(qubit2)).Times(1).WillOnce(Return(MeasurementOutcome{.basis = 'Z', .outcome_is_plus = true}));
EXPECT_CALL(*callback, measureQubitX(qubit1)).Times(1).WillOnce(Return(MeasurementOutcome{.basis = quisp::backends::abstract::Basis::X, .outcome_is_plus = false}));
EXPECT_CALL(*callback, measureQubitZ(qubit2)).Times(1).WillOnce(Return(MeasurementOutcome{.basis = quisp::backends::abstract::Basis::Z, .outcome_is_plus = true}));
EXPECT_CALL(*callback, freeAndResetQubit(qubit1)).Times(1);
EXPECT_CALL(*callback, freeAndResetQubit(qubit2)).Times(1);
EXPECT_CALL(*callback, sendSwappingResult(ruleset_id, QNodeAddr{left_partner_addr}, QNodeAddr{right_partner_addr}, 123, 4, 0b01)).Times(1);
Expand Down