Program Listing for File gate_matrix_diagonal.hpp

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

#pragma once

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

class DllExport QuantumGateDiagonalMatrix : public QuantumGateBase {
private:
    // list of elements of unitary matrix as 1D array with length dim
    ComplexVector _diagonal_element;

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

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

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

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

    virtual ~QuantumGateDiagonalMatrix(){};

    virtual void add_control_qubit(UINT qubit_index, UINT control_value);

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

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

    virtual void update_quantum_state(QuantumStateBase* state) override;

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

    virtual QuantumGateDiagonalMatrix* get_inverse(void) const override {
        return new QuantumGateDiagonalMatrix(this->target_qubit_list,
            this->_diagonal_element.conjugate(), this->control_qubit_list);
    }

    virtual void set_matrix(ComplexMatrix& matrix) const override {
        ITYPE dim = this->_diagonal_element.size();
        matrix = ComplexMatrix::Zero(dim, dim);
        for (ITYPE i = 0; i < dim; ++i) {
            matrix(i, i) = this->_diagonal_element[i];
        }
    }

    virtual std::string to_string() const override;

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

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

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