Program Listing for File noisesimulator.hpp

Return to documentation for file (/home/docs/checkouts/readthedocs.org/user_builds/qulacs-rtd/checkouts/latest/src/cppsim/noisesimulator.hpp)

#ifdef _MSC_VER
#define _CRT_SECURE_NO_WARNINGS
#endif

#include "circuit.hpp"
#include "gate_factory.hpp"
#include "gate_merge.hpp"
#include "state.hpp"

class DllExport NoiseSimulator {
private:
    Random random;
    QuantumCircuit* circuit;
    QuantumStateBase* initial_state;

    struct SamplingRequest {
        std::vector<UINT> gate_pos;
        UINT num_of_sampling;
        SamplingRequest(
            std::vector<UINT> init_gate_pos, UINT init_num_of_sampling)
            : gate_pos(init_gate_pos), num_of_sampling(init_num_of_sampling) {}
    };

    void apply_gates(const std::vector<UINT>& chosen_gate,
        QuantumState* sampling_state, const int StartPos);

    std::vector<SamplingRequest> generate_sampling_request(
        const UINT sample_count);

    UINT randomly_select_which_gate_pos_to_apply(QuantumGateBase* gate);

    std::vector<std::pair<QuantumState*, UINT>> simulate(
        std::vector<SamplingRequest> sampling_request_vector);

public:
    struct Result {
    public:
        std::vector<std::pair<QuantumState*, UINT>> result;

        Result(const std::vector<std::pair<QuantumState*, UINT>>& result_);
        ~Result();
        std::vector<ITYPE> sampling() const;
    };

    explicit NoiseSimulator(const QuantumCircuit* init_circuit,
        const QuantumState* init_state = NULL);
    virtual ~NoiseSimulator();

    virtual std::vector<ITYPE> execute(const UINT sample_count);

    virtual Result* execute_and_get_result(const UINT execution_count);
};