diff --git a/plugins/quantum_computing/src/CMakeLists.txt b/plugins/quantum_computing/src/CMakeLists.txt index bba6f6b..afbf3d7 100644 --- a/plugins/quantum_computing/src/CMakeLists.txt +++ b/plugins/quantum_computing/src/CMakeLists.txt @@ -5,19 +5,21 @@ list(APPEND HEADERS BlochSphere.h QuantumState.h Qubit.h - QuantumGate.h QuantumOperator.h QuantumCircuitReader.h - QuantumCircuitElement.h - QuantumWire.h - QuantumTerminal.h - BasicQuantumGates.h + QuantumSimulator.h + circuit_elements/QuantumCircuitElement.h + circuit_elements/QuantumWire.h + circuit_elements/QuantumGate.h + circuit_elements/QuantumTerminal.h + circuit_elements/BasicQuantumGates.h visuals/BlochSphereNode.h visuals/QuantumCircuitNode.h visuals/QuantumCircuitElementNode.h visuals/QuantumGateNode.h visuals/QuantumWireNode.h visuals/QuantumTerminalNode.h + visuals/QuantumStateNode.h ) list(APPEND SOURCES @@ -25,19 +27,21 @@ list(APPEND SOURCES BlochSphere.cpp QuantumState.cpp Qubit.cpp - QuantumGate.cpp - QuantumOperator.cpp + QuantumOperator.cpp QuantumCircuitReader.cpp - QuantumCircuitElement.cpp - QuantumWire.cpp - QuantumTerminal.cpp - BasicQuantumGates.cpp + QuantumSimulator.cpp + circuit_elements/QuantumGate.cpp + circuit_elements/QuantumCircuitElement.cpp + circuit_elements/QuantumWire.cpp + circuit_elements/QuantumTerminal.cpp + circuit_elements/BasicQuantumGates.cpp visuals/BlochSphereNode.cpp visuals/QuantumCircuitNode.cpp visuals/QuantumCircuitElementNode.cpp visuals/QuantumGateNode.cpp visuals/QuantumWireNode.cpp visuals/QuantumTerminalNode.cpp + visuals/QuantumStateNode.cpp visuals/BlochSphereNode.cpp ) @@ -45,6 +49,7 @@ add_library(${PLUGIN_NAME} SHARED ${SOURCES} ${HEADERS}) target_include_directories(${PLUGIN_NAME} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/circuit_elements ${CMAKE_CURRENT_SOURCE_DIR}/visuals ) target_link_libraries(${PLUGIN_NAME} PUBLIC core visual_elements ntk_math publishing) diff --git a/plugins/quantum_computing/src/QuantumCircuit.cpp b/plugins/quantum_computing/src/QuantumCircuit.cpp index afad59d..2ee58f1 100644 --- a/plugins/quantum_computing/src/QuantumCircuit.cpp +++ b/plugins/quantum_computing/src/QuantumCircuit.cpp @@ -48,6 +48,16 @@ const std::vector& QuantumCircuit::getQuantumWires() const return mWires; } +QuantumState QuantumCircuit::getInputState() const +{ + QuantumState state; + for (const auto input : mInputTerminals) + { + state.addValue(input->getValue()); + } + return state; +} + void QuantumCircuit::buildWireConnections() { for (const auto& wire : mWires) diff --git a/plugins/quantum_computing/src/QuantumCircuit.h b/plugins/quantum_computing/src/QuantumCircuit.h index 38ab47d..220931d 100644 --- a/plugins/quantum_computing/src/QuantumCircuit.h +++ b/plugins/quantum_computing/src/QuantumCircuit.h @@ -4,6 +4,7 @@ #include "QuantumGate.h" #include "QuantumTerminal.h" #include "QuantumWire.h" +#include "QuantumState.h" #include @@ -28,6 +29,8 @@ public: const std::vector& getQuantumWires() const; + QuantumState getInputState() const; + private: bool connectivityIsValid() const; diff --git a/plugins/quantum_computing/src/QuantumSimulator.cpp b/plugins/quantum_computing/src/QuantumSimulator.cpp new file mode 100644 index 0000000..9d3cdf1 --- /dev/null +++ b/plugins/quantum_computing/src/QuantumSimulator.cpp @@ -0,0 +1,25 @@ +#include "QuantumSimulator.h" + +#include "QuantumCircuit.h" + +const QuantumState& QuantumSimulator::getInputState() const +{ + return mInputState; +} + +const QuantumState& QuantumSimulator::getOutputState() const +{ + return mOutputState; +} + +void QuantumSimulator::setCircuit(QuantumCircuit* circuit) +{ + mCircuit = circuit; +} + +void QuantumSimulator::run() +{ + mInputState = mCircuit->getInputState(); + + mOutputState = mInputState; +} \ No newline at end of file diff --git a/plugins/quantum_computing/src/QuantumSimulator.h b/plugins/quantum_computing/src/QuantumSimulator.h new file mode 100644 index 0000000..fb7462b --- /dev/null +++ b/plugins/quantum_computing/src/QuantumSimulator.h @@ -0,0 +1,23 @@ +#pragma once + +#include "QuantumState.h" + +class QuantumCircuit; + +class QuantumSimulator +{ +public: + const QuantumState& getInputState() const; + + const QuantumState& getOutputState() const; + + void setCircuit(QuantumCircuit* circuit); + + void run(); + +public: + QuantumState mInputState; + QuantumState mOutputState; + + QuantumCircuit* mCircuit{ nullptr }; +}; \ No newline at end of file diff --git a/plugins/quantum_computing/src/QuantumState.cpp b/plugins/quantum_computing/src/QuantumState.cpp index d3500bc..bd869c4 100644 --- a/plugins/quantum_computing/src/QuantumState.cpp +++ b/plugins/quantum_computing/src/QuantumState.cpp @@ -3,4 +3,15 @@ const std::vector& QuantumState::getData() const { return mState; +} + +std::string QuantumState::toString() const +{ + std::string out; + std::size_t count{ 0 }; + for (const auto& qubit : mState) + { + out += "|" + qubit.toString() + "\n"; + } + return out; } \ No newline at end of file diff --git a/plugins/quantum_computing/src/QuantumState.h b/plugins/quantum_computing/src/QuantumState.h index 44c20e4..ee96847 100644 --- a/plugins/quantum_computing/src/QuantumState.h +++ b/plugins/quantum_computing/src/QuantumState.h @@ -3,11 +3,20 @@ #include "Qubit.h" #include +#include class QuantumState { +public: + void addValue(const Qubit& data) + { + mState.push_back(data); + } + const std::vector& getData() const; + std::string toString() const; + private: std::vector mState; }; \ No newline at end of file diff --git a/plugins/quantum_computing/src/Qubit.cpp b/plugins/quantum_computing/src/Qubit.cpp index 2845a0c..8ba0a6c 100644 --- a/plugins/quantum_computing/src/Qubit.cpp +++ b/plugins/quantum_computing/src/Qubit.cpp @@ -1,5 +1,7 @@ #include "Qubit.h" +#include + Qubit::Qubit(const ComplexNumber& alpha, const ComplexNumber& beta) : mAlpha(alpha), mBeta(beta) @@ -25,4 +27,12 @@ bool Qubit::isIn0State() const bool Qubit::isIn1State() const { return mBeta.getReal() == 1.0 && mAlpha.getMagnitude() == 0.0; +} + +std::string Qubit::toString(std::size_t precision) const +{ + std::stringstream sstr; + sstr.precision(precision); + sstr << "alpha " << mAlpha.getReal() << " " << mAlpha.getImaginary() << "i , beta " << mBeta.getReal() << " " << mBeta.getImaginary() << "i"; + return sstr.str(); } \ No newline at end of file diff --git a/plugins/quantum_computing/src/Qubit.h b/plugins/quantum_computing/src/Qubit.h index c10438f..51197d4 100644 --- a/plugins/quantum_computing/src/Qubit.h +++ b/plugins/quantum_computing/src/Qubit.h @@ -2,6 +2,8 @@ #include "ComplexNumber.h" +#include + class Qubit { public: @@ -14,6 +16,8 @@ public: bool isIn0State() const; bool isIn1State() const; + + std::string toString(std::size_t precision=3) const; private: ComplexNumber mAlpha; ComplexNumber mBeta; diff --git a/plugins/quantum_computing/src/BasicQuantumGates.cpp b/plugins/quantum_computing/src/circuit_elements/BasicQuantumGates.cpp similarity index 100% rename from plugins/quantum_computing/src/BasicQuantumGates.cpp rename to plugins/quantum_computing/src/circuit_elements/BasicQuantumGates.cpp diff --git a/plugins/quantum_computing/src/BasicQuantumGates.h b/plugins/quantum_computing/src/circuit_elements/BasicQuantumGates.h similarity index 100% rename from plugins/quantum_computing/src/BasicQuantumGates.h rename to plugins/quantum_computing/src/circuit_elements/BasicQuantumGates.h diff --git a/plugins/quantum_computing/src/QuantumCircuitElement.cpp b/plugins/quantum_computing/src/circuit_elements/QuantumCircuitElement.cpp similarity index 100% rename from plugins/quantum_computing/src/QuantumCircuitElement.cpp rename to plugins/quantum_computing/src/circuit_elements/QuantumCircuitElement.cpp diff --git a/plugins/quantum_computing/src/QuantumCircuitElement.h b/plugins/quantum_computing/src/circuit_elements/QuantumCircuitElement.h similarity index 100% rename from plugins/quantum_computing/src/QuantumCircuitElement.h rename to plugins/quantum_computing/src/circuit_elements/QuantumCircuitElement.h diff --git a/plugins/quantum_computing/src/QuantumGate.cpp b/plugins/quantum_computing/src/circuit_elements/QuantumGate.cpp similarity index 100% rename from plugins/quantum_computing/src/QuantumGate.cpp rename to plugins/quantum_computing/src/circuit_elements/QuantumGate.cpp diff --git a/plugins/quantum_computing/src/QuantumGate.h b/plugins/quantum_computing/src/circuit_elements/QuantumGate.h similarity index 100% rename from plugins/quantum_computing/src/QuantumGate.h rename to plugins/quantum_computing/src/circuit_elements/QuantumGate.h diff --git a/plugins/quantum_computing/src/QuantumTerminal.cpp b/plugins/quantum_computing/src/circuit_elements/QuantumTerminal.cpp similarity index 100% rename from plugins/quantum_computing/src/QuantumTerminal.cpp rename to plugins/quantum_computing/src/circuit_elements/QuantumTerminal.cpp diff --git a/plugins/quantum_computing/src/QuantumTerminal.h b/plugins/quantum_computing/src/circuit_elements/QuantumTerminal.h similarity index 100% rename from plugins/quantum_computing/src/QuantumTerminal.h rename to plugins/quantum_computing/src/circuit_elements/QuantumTerminal.h diff --git a/plugins/quantum_computing/src/QuantumWire.cpp b/plugins/quantum_computing/src/circuit_elements/QuantumWire.cpp similarity index 100% rename from plugins/quantum_computing/src/QuantumWire.cpp rename to plugins/quantum_computing/src/circuit_elements/QuantumWire.cpp diff --git a/plugins/quantum_computing/src/QuantumWire.h b/plugins/quantum_computing/src/circuit_elements/QuantumWire.h similarity index 100% rename from plugins/quantum_computing/src/QuantumWire.h rename to plugins/quantum_computing/src/circuit_elements/QuantumWire.h diff --git a/plugins/quantum_computing/src/visuals/QuantumStateNode.cpp b/plugins/quantum_computing/src/visuals/QuantumStateNode.cpp new file mode 100644 index 0000000..e69de29 diff --git a/plugins/quantum_computing/src/visuals/QuantumStateNode.h b/plugins/quantum_computing/src/visuals/QuantumStateNode.h new file mode 100644 index 0000000..e69de29 diff --git a/plugins/quantum_computing/test/CMakeLists.txt b/plugins/quantum_computing/test/CMakeLists.txt index 68e34a7..07690dc 100644 --- a/plugins/quantum_computing/test/CMakeLists.txt +++ b/plugins/quantum_computing/test/CMakeLists.txt @@ -2,6 +2,7 @@ list(APPEND UNIT_TEST_FILES TestBlochSphereNode.cpp TestQuantumCircuitParsing.cpp + TestQuantumSimulator.cpp ) add_executable(quantum_computing_unit_tests ${CMAKE_SOURCE_DIR}/test/test_runner.cpp ${UNIT_TEST_FILES}) diff --git a/plugins/quantum_computing/test/TestQuantumSimulator.cpp b/plugins/quantum_computing/test/TestQuantumSimulator.cpp new file mode 100644 index 0000000..4d80972 --- /dev/null +++ b/plugins/quantum_computing/test/TestQuantumSimulator.cpp @@ -0,0 +1,27 @@ +#include "TestFramework.h" +#include "TestUtils.h" +#include "TestRenderUtils.h" + +#include "QuantumCircuitReader.h" +#include "QuantumCircuitNode.h" +#include "QuantumCircuit.h" + +#include "QuantumState.h" +#include "QuantumSimulator.h" + +#include "File.h" + +TEST_CASE(TestQuantumSimulator, "quantum_computing") +{ + QuantumCircuitReader reader; + auto circuit = reader.read(TestUtils::getTestDataDir() / "quantum_circuit.dat"); + + QuantumSimulator simulator; + simulator.setCircuit(circuit.get()); + simulator.run(); + + auto input_state = simulator.getInputState(); + + File file(TestUtils::getTestOutputDir(__FILE__) / "out.dat"); + file.writeText(input_state.toString()); +} \ No newline at end of file