Skip to content

Commit

Permalink
Integrate changes of noise aware simulation (#126)
Browse files Browse the repository at this point in the history
Co-authored-by: Thomas Grurl <Thomas.Grurl@fh-hagenberg.at>
Co-authored-by: Lukas Burgholzer <lukas.burgholzer@jku.at>
Co-authored-by: burgholzer <burgholzer@me.com>
  • Loading branch information
4 people authored Jul 5, 2022
1 parent 933c666 commit fa019ea
Show file tree
Hide file tree
Showing 13 changed files with 1,167 additions and 66 deletions.
1 change: 1 addition & 0 deletions include/QuantumComputation.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -243,6 +243,7 @@ namespace qc {
[[nodiscard]] const QuantumRegisterMap& getQregs() const { return qregs; }
[[nodiscard]] const ClassicalRegisterMap& getCregs() const { return cregs; }
[[nodiscard]] const QuantumRegisterMap& getANCregs() const { return ancregs; }
[[nodiscard]] decltype(mt)& getGenerator() { return mt; }

void setName(const std::string& n) { name = n; }

Expand Down
706 changes: 706 additions & 0 deletions include/dd/NoiseFunctionality.hpp

Large diffs are not rendered by default.

5 changes: 3 additions & 2 deletions include/dd/Operations.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,9 @@
#include <variant>

namespace qc {
using VectorDD = dd::vEdge;
using MatrixDD = dd::mEdge;
using VectorDD = dd::vEdge;
using MatrixDD = dd::mEdge;
using DensityMatrixDD = dd::dEdge;
} // namespace qc

namespace dd {
Expand Down
8 changes: 8 additions & 0 deletions include/operations/CompoundOperation.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -158,5 +158,13 @@ namespace qc {
[[nodiscard]] const auto& at(std::size_t i) const { return ops.at(i); }

std::vector<std::unique_ptr<Operation>>& getOps() { return ops; }

[[nodiscard]] std::set<dd::Qubit> getUsedQubits() const override {
std::set<dd::Qubit> usedQubits{};
for (const auto& op: ops) {
usedQubits.merge(op->getUsedQubits());
}
return usedQubits;
}
};
} // namespace qc
5 changes: 5 additions & 0 deletions include/operations/NonUnitaryOperation.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -103,5 +103,10 @@ namespace qc {

void dumpOpenQASM(std::ostream& of, const RegisterNames& qreg, const RegisterNames& creg) const override;
void dumpQiskit(std::ostream& of, const RegisterNames& qreg, const RegisterNames& creg, const char* anc_reg_name) const override;

[[nodiscard]] std::set<dd::Qubit> getUsedQubits() const override {
const auto& targets = getTargets();
return std::set<dd::Qubit>{targets.begin(), targets.end()};
}
};
} // namespace qc
9 changes: 8 additions & 1 deletion include/operations/OpType.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,14 @@ namespace qc {
Barrier,
Teleportation,
// Classically-controlled Operation
ClassicControlled
ClassicControlled,
// Noise operations
ATrue,
AFalse,
MultiATrue,
MultiAFalse,
// Number of OpTypes
OpCount
};

inline std::string toString(const OpType& opType) {
Expand Down
10 changes: 10 additions & 0 deletions include/operations/Operation.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -96,6 +96,16 @@ namespace qc {
return startQubit;
}

[[nodiscard]] virtual std::set<dd::Qubit> getUsedQubits() const {
const auto& opTargets = getTargets();
const auto& opControls = getControls();
std::set<dd::Qubit> usedQubits = {opTargets.begin(), opTargets.end()};
for (const auto& control: opControls) {
usedQubits.insert(control.qubit);
}
return usedQubits;
}

// Setter
virtual void setNqubits(dd::QubitCount nq) {
nqubits = nq;
Expand Down
1 change: 1 addition & 0 deletions src/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ add_library(${PROJECT_NAME}
${${PROJECT_NAME}_SOURCE_DIR}/include/dd/Operations.hpp
${${PROJECT_NAME}_SOURCE_DIR}/include/dd/FunctionalityConstruction.hpp
${${PROJECT_NAME}_SOURCE_DIR}/include/dd/Simulation.hpp
${${PROJECT_NAME}_SOURCE_DIR}/include/dd/NoiseFunctionality.hpp

${${PROJECT_NAME}_SOURCE_DIR}/include/zx/FunctionalityConstruction.hpp

Expand Down
13 changes: 2 additions & 11 deletions src/parsers/RealParser.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -265,17 +265,8 @@ void qc::QuantumComputation::readRealGateDescriptions(std::istream& is, int line
controls.pop_back();
emplace_back<StandardOperation>(nqubits, dd::Controls{controls.cbegin(), controls.cend()}, target, target1, gate);
break;
case Compound:
case Measure:
case Reset:
case Snapshot:
case ShowProbabilities:
case Barrier:
case ClassicControlled:
case SX:
case SXdag:
case Teleportation:
std::cerr << "Operation with invalid type " << gate << " read from real file. Proceed with caution!" << std::endl;
default:
std::cerr << "Unsupported operation encountered: " << gate << "!" << std::endl;
break;
}
}
Expand Down
95 changes: 48 additions & 47 deletions test/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,18 +1,18 @@
if (NOT TARGET gtest OR NOT TARGET gmock)
# Prevent overriding the parent project's compiler/linker settings on Windows
set(gtest_force_shared_crt ON CACHE BOOL "" FORCE)
add_subdirectory("${PROJECT_SOURCE_DIR}/extern/dd_package/extern/googletest" "extern/dd_package/extern/googletest" EXCLUDE_FROM_ALL)
mark_as_advanced(
BUILD_GMOCK BUILD_GTEST BUILD_SHARED_LIBS
gmock_build_tests gtest_build_samples gtest_build_tests
gtest_disable_pthreads gtest_force_shared_crt gtest_hide_internal_symbols
)
set_target_properties(gtest gtest_main gmock gmock_main PROPERTIES FOLDER extern)
if (BINDINGS AND NOT WIN32)
# adjust visibility settings for building Python bindings
target_compile_options(gtest PUBLIC -fvisibility=hidden)
target_compile_options(gmock PUBLIC -fvisibility=hidden)
endif ()
# Prevent overriding the parent project's compiler/linker settings on Windows
set(gtest_force_shared_crt ON CACHE BOOL "" FORCE)
add_subdirectory("${PROJECT_SOURCE_DIR}/extern/dd_package/extern/googletest" "extern/dd_package/extern/googletest" EXCLUDE_FROM_ALL)
mark_as_advanced(
BUILD_GMOCK BUILD_GTEST BUILD_SHARED_LIBS
gmock_build_tests gtest_build_samples gtest_build_tests
gtest_disable_pthreads gtest_force_shared_crt gtest_hide_internal_symbols
)
set_target_properties(gtest gtest_main gmock gmock_main PROPERTIES FOLDER extern)
if (BINDINGS AND NOT WIN32)
# adjust visibility settings for building Python bindings
target_compile_options(gtest PUBLIC -fvisibility=hidden)
target_compile_options(gmock PUBLIC -fvisibility=hidden)
endif ()
endif ()

add_executable(${PROJECT_NAME}_example ${CMAKE_CURRENT_SOURCE_DIR}/main.cpp)
Expand All @@ -21,44 +21,45 @@ set_target_properties(${PROJECT_NAME}_example PROPERTIES FOLDER tests CMAKE_CXX_
enable_lto(${PROJECT_NAME}_example)

add_custom_command(TARGET ${PROJECT_NAME}_example
POST_BUILD
COMMAND ${CMAKE_COMMAND} -E create_symlink $<TARGET_FILE_DIR:${PROJECT_NAME}_example>/${PROJECT_NAME}_example ${CMAKE_BINARY_DIR}/${PROJECT_NAME}_example
COMMAND ${CMAKE_COMMAND} -E copy_directory ${CMAKE_CURRENT_SOURCE_DIR}/circuits/ $<TARGET_FILE_DIR:${PROJECT_NAME}_example>/circuits
COMMAND ${CMAKE_COMMAND} -E create_symlink $<TARGET_FILE_DIR:${PROJECT_NAME}_example>/circuits ${CMAKE_BINARY_DIR}/circuits
COMMENT "Copying circuits and creating symlinks for ${PROJECT_NAME}_example"
VERBATIM)
POST_BUILD
COMMAND ${CMAKE_COMMAND} -E create_symlink $<TARGET_FILE_DIR:${PROJECT_NAME}_example>/${PROJECT_NAME}_example ${CMAKE_BINARY_DIR}/${PROJECT_NAME}_example
COMMAND ${CMAKE_COMMAND} -E copy_directory ${CMAKE_CURRENT_SOURCE_DIR}/circuits/ $<TARGET_FILE_DIR:${PROJECT_NAME}_example>/circuits
COMMAND ${CMAKE_COMMAND} -E create_symlink $<TARGET_FILE_DIR:${PROJECT_NAME}_example>/circuits ${CMAKE_BINARY_DIR}/circuits
COMMENT "Copying circuits and creating symlinks for ${PROJECT_NAME}_example"
VERBATIM)

macro(package_add_test TESTNAME)
# create an exectuable in which the tests will be stored
add_executable(${TESTNAME} ${ARGN})
# link the Google test infrastructure and a default main fuction to the test executable.
target_link_libraries(${TESTNAME} PRIVATE ${PROJECT_NAME} gmock gtest_main)
# discover tests
gtest_discover_tests(${TESTNAME} WORKING_DIRECTORY ${PROJECT_DIR} PROPERTIES VS_DEBUGGER_WORKING_DIRECTORY "${PROJECT_DIR}")
set_target_properties(${TESTNAME} PROPERTIES FOLDER tests CMAKE_CXX_STANDARD_REQUIRED ON CXX_EXTENSIONS OFF)
enable_lto(${TESTNAME})
# create an exectuable in which the tests will be stored
add_executable(${TESTNAME} ${ARGN})
# link the Google test infrastructure and a default main fuction to the test executable.
target_link_libraries(${TESTNAME} PRIVATE ${PROJECT_NAME} gmock gtest_main)
# discover tests
gtest_discover_tests(${TESTNAME} WORKING_DIRECTORY ${PROJECT_DIR} PROPERTIES VS_DEBUGGER_WORKING_DIRECTORY "${PROJECT_DIR}")
set_target_properties(${TESTNAME} PROPERTIES FOLDER tests CMAKE_CXX_STANDARD_REQUIRED ON CXX_EXTENSIONS OFF)
enable_lto(${TESTNAME})
endmacro()

# add unit tests
package_add_test(${PROJECT_NAME}_test
${CMAKE_CURRENT_SOURCE_DIR}/algorithms/test_qft.cpp
${CMAKE_CURRENT_SOURCE_DIR}/algorithms/test_grover.cpp
${CMAKE_CURRENT_SOURCE_DIR}/algorithms/test_bernsteinvazirani.cpp
${CMAKE_CURRENT_SOURCE_DIR}/algorithms/test_entanglement.cpp
${CMAKE_CURRENT_SOURCE_DIR}/algorithms/test_grcs.cpp
${CMAKE_CURRENT_SOURCE_DIR}/algorithms/test_random_clifford.cpp
${CMAKE_CURRENT_SOURCE_DIR}/algorithms/test_qpe.cpp
${CMAKE_CURRENT_SOURCE_DIR}/unittests/test_io.cpp
${CMAKE_CURRENT_SOURCE_DIR}/unittests/test_dd_functionality.cpp
${CMAKE_CURRENT_SOURCE_DIR}/unittests/test_qfr_functionality.cpp
${CMAKE_CURRENT_SOURCE_DIR}/algorithms/eval_dynamic_circuits.cpp
${CMAKE_CURRENT_SOURCE_DIR}/unittests/test_zx_functionality.cpp)

${CMAKE_CURRENT_SOURCE_DIR}/algorithms/test_qft.cpp
${CMAKE_CURRENT_SOURCE_DIR}/algorithms/test_grover.cpp
${CMAKE_CURRENT_SOURCE_DIR}/algorithms/test_bernsteinvazirani.cpp
${CMAKE_CURRENT_SOURCE_DIR}/algorithms/test_entanglement.cpp
${CMAKE_CURRENT_SOURCE_DIR}/algorithms/test_grcs.cpp
${CMAKE_CURRENT_SOURCE_DIR}/algorithms/test_random_clifford.cpp
${CMAKE_CURRENT_SOURCE_DIR}/algorithms/test_qpe.cpp
${CMAKE_CURRENT_SOURCE_DIR}/unittests/test_io.cpp
${CMAKE_CURRENT_SOURCE_DIR}/unittests/test_dd_functionality.cpp
${CMAKE_CURRENT_SOURCE_DIR}/unittests/test_qfr_functionality.cpp
${CMAKE_CURRENT_SOURCE_DIR}/algorithms/eval_dynamic_circuits.cpp
${CMAKE_CURRENT_SOURCE_DIR}/unittests/test_zx_functionality.cpp
${CMAKE_CURRENT_SOURCE_DIR}/unittests/test_dd_noise_functionality.cpp)


add_custom_command(TARGET ${PROJECT_NAME}_test
POST_BUILD
COMMAND ${CMAKE_COMMAND} -E create_symlink $<TARGET_FILE_DIR:${PROJECT_NAME}_test>/${PROJECT_NAME}_test ${CMAKE_BINARY_DIR}/${PROJECT_NAME}_test
COMMAND ${CMAKE_COMMAND} -E copy_directory ${CMAKE_CURRENT_SOURCE_DIR}/circuits $<TARGET_FILE_DIR:${PROJECT_NAME}_test>/circuits
COMMAND ${CMAKE_COMMAND} -E create_symlink $<TARGET_FILE_DIR:${PROJECT_NAME}_test>/circuits ${CMAKE_BINARY_DIR}/circuits
COMMENT "Copying circuits and creating symlinks for ${PROJECT_NAME}_test"
VERBATIM)
POST_BUILD
COMMAND ${CMAKE_COMMAND} -E create_symlink $<TARGET_FILE_DIR:${PROJECT_NAME}_test>/${PROJECT_NAME}_test ${CMAKE_BINARY_DIR}/${PROJECT_NAME}_test
COMMAND ${CMAKE_COMMAND} -E copy_directory ${CMAKE_CURRENT_SOURCE_DIR}/circuits $<TARGET_FILE_DIR:${PROJECT_NAME}_test>/circuits
COMMAND ${CMAKE_COMMAND} -E create_symlink $<TARGET_FILE_DIR:${PROJECT_NAME}_test>/circuits ${CMAKE_BINARY_DIR}/circuits
COMMENT "Copying circuits and creating symlinks for ${PROJECT_NAME}_test"
VERBATIM)
8 changes: 4 additions & 4 deletions test/algorithms/eval_dynamic_circuits.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -159,7 +159,7 @@ TEST_P(DynamicCircuitEvalExactQPE, UnitaryTransformation) {
ofs.open("results_exact.csv", std::ios_base::app);
ofs << ss.str() << std::endl;

EXPECT_TRUE(e.p->ident);
EXPECT_TRUE(e.p->isIdentity());
}

TEST_P(DynamicCircuitEvalExactQPE, ProbabilityExtraction) {
Expand Down Expand Up @@ -353,7 +353,7 @@ TEST_P(DynamicCircuitEvalInexactQPE, UnitaryTransformation) {
ofs.open("results_inexact.csv", std::ios_base::app);
ofs << ss.str() << std::endl;

EXPECT_TRUE(e.p->ident);
EXPECT_TRUE(e.p->isIdentity());
}

TEST_P(DynamicCircuitEvalInexactQPE, ProbabilityExtraction) {
Expand Down Expand Up @@ -500,7 +500,7 @@ TEST_P(DynamicCircuitEvalBV, UnitaryTransformation) {
ofs.open("results_bv.csv", std::ios_base::app);
ofs << ss.str() << std::endl;

EXPECT_TRUE(e.p->ident);
EXPECT_TRUE(e.p->isIdentity());
}

TEST_P(DynamicCircuitEvalBV, ProbabilityExtraction) {
Expand Down Expand Up @@ -641,7 +641,7 @@ TEST_P(DynamicCircuitEvalQFT, UnitaryTransformation) {
ofs.open("results_qft.csv", std::ios_base::app);
ofs << ss.str() << std::endl;

EXPECT_TRUE(e.p->ident);
EXPECT_TRUE(e.p->isIdentity());
}

TEST_P(DynamicCircuitEvalQFT, ProbabilityExtraction) {
Expand Down
Loading

0 comments on commit fa019ea

Please sign in to comment.