Program Listing for File gate_matrix_sparse.hpp

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

#pragma once

#include "gate.hpp"
#include "type.hpp"

class DllExport QuantumGateSparseMatrix : public QuantumGateBase {
private:
    // list of elements of unitary matrix as 1D array with length dim*dim (only
    // for dense gate))
    SparseComplexMatrix _matrix_element;

public:
    QuantumGateSparseMatrix(const std::vector<UINT>& target_qubit_index_list,
        const SparseComplexMatrix& matrix_element,
        const std::vector<UINT>& control_qubit_index_list = {});

    QuantumGateSparseMatrix(const std::vector<UINT>& target_qubit_index_list,
        SparseComplexMatrix* matrix_element,
        const std::vector<UINT>& control_qubit_index_list = {});

    QuantumGateSparseMatrix(
        const std::vector<TargetQubitInfo>& target_qubit_index_list,
        const SparseComplexMatrix& matrix_element,
        const std::vector<ControlQubitInfo>& control_qubit_index_list = {});

    QuantumGateSparseMatrix(
        const std::vector<TargetQubitInfo>& target_qubit_index_list,
        SparseComplexMatrix* matrix_element,
        const std::vector<ControlQubitInfo>& control_qubit_index_list = {});

    virtual ~QuantumGateSparseMatrix(){};

    virtual void add_control_qubit(UINT qubit_index, UINT control_value);

    virtual void multiply_scalar(CPPCTYPE value) { _matrix_element *= value; }

    virtual void set_gate_property(UINT gate_property_) {
        _gate_property = gate_property_;
    }

    virtual void update_quantum_state(QuantumStateBase* state) override;

    virtual QuantumGateSparseMatrix* copy() const override {
        return new QuantumGateSparseMatrix(*this);
    };

    virtual void set_matrix(ComplexMatrix& matrix) const override {
        matrix = this->_matrix_element.toDense();
    }

    virtual std::string to_string() const override;

    boost::property_tree::ptree to_ptree() const override;

    friend DllExport std::ostream& operator<<(
        std::ostream& os, const QuantumGateSparseMatrix& gate);

    friend DllExport std::ostream& operator<<(
        std::ostream& os, QuantumGateSparseMatrix* gate);
};