class QPanda::MPSQVM

Overview

MPS quantum virtual machine. More…

#include <MPSQVM.h>

class MPSQVM:
    public QPanda::IdealQVM,
    private QPanda::TraversalInterface
{
public:
    // methods

    virtual void init();

    virtual void initState(
        const QStat& state = {},
        const QVec& qlist = {}
        );

    virtual std::map<std::string, bool> directlyRun(QProg& qProg);

    virtual std::map<std::string, size_t> quickMeasure(
        QVec vQubit,
        size_t shots
        );

    virtual std::map<std::string, size_t> runWithConfiguration(QProg&, std::vector<ClassicalCondition>&, int);
    virtual std::map<std::string, size_t> runWithConfiguration(QProg&, std::vector<ClassicalCondition>&, rapidjson::Document&);
    virtual QStat getQState();

    virtual prob_tuple pMeasure(
        QVec qubits,
        int select_max = -1
        );

    virtual prob_tuple PMeasure(
        QVec qubits,
        int select_max = -1
        );

    virtual prob_vec PMeasure_no_index(QVec qubits);
    prob_vec pMeasureNoIndex(QVec qubit_vector);

    qcomplex_t pmeasure_bin_index(
        QProg prog,
        std::string str
        );

    qcomplex_t pmeasure_dec_index(
        QProg prog,
        std::string str
        );

    QStat pmeasure_bin_subset(
        QProg prog,
        const std::vector<std::string>& bin_strs
        );

    QStat pmeasure_dec_subset(
        QProg prog,
        const std::vector<std::string>& dec_strs
        );

    virtual prob_tuple getProbTupleList(
        QVec,
        int selectMax = -1
        );

    virtual prob_vec getProbList(
        QVec,
        int selectMax = -1
        );

    virtual prob_dict getProbDict(
        QVec,
        int selectMax = -1
        );

    virtual prob_tuple probRunTupleList(
        QProg&,
        QVec,
        int selectMax = -1
        );

    virtual prob_vec probRunList(
        QProg&,
        QVec,
        int selectMax = -1
        );

    virtual prob_dict probRunDict(
        QProg&,
        QVec,
        int selectMax = -1
        );

    void execute(
        std::shared_ptr<AbstractQGateNode>,
        std::shared_ptr<QNode>,
        QCircuitConfig& config
        );

    void execute(
        std::shared_ptr<AbstractClassicalProg>,
        std::shared_ptr<QNode>,
        QCircuitConfig& config
        );

    void execute(
        std::shared_ptr<AbstractQuantumMeasure>,
        std::shared_ptr<QNode>,
        QCircuitConfig& config
        );

    void execute(
        std::shared_ptr<AbstractQuantumReset>,
        std::shared_ptr<QNode>,
        QCircuitConfig& config
        );

    void execute(
        std::shared_ptr<AbstractQuantumCircuit>,
        std::shared_ptr<QNode>,
        QCircuitConfig& config
        );

    void execute(
        std::shared_ptr<AbstractQuantumProgram>,
        std::shared_ptr<QNode>,
        QCircuitConfig& config
        );

    void execute(
        std::shared_ptr<AbstractControlFlowNode>,
        std::shared_ptr<QNode>,
        QCircuitConfig& config
        );

    void set_mixed_unitary_error(
        GateType gate_type,
        const std::vector<QStat>&
        );

    void set_mixed_unitary_error(
        GateType gate_type,
        const std::vector<QStat>&,
        const std::vector<double>&
        );

    void set_mixed_unitary_error(
        GateType gate_type,
        const std::vector<QStat>&,
        const std::vector<QVec>&
        );

    void set_mixed_unitary_error(
        GateType gate_type,
        const std::vector<QStat>&,
        const std::vector<double>&,
        const std::vector<QVec>&
        );

    void set_noise_model(
        NOISE_MODEL model,
        GateType gate_type,
        double param
        );

    void set_noise_model(
        NOISE_MODEL model,
        GateType gate_type,
        double param,
        const QVec& qubits_vec
        );

    void set_noise_model(
        NOISE_MODEL model,
        GateType gate_type,
        double param,
        const std::vector<QVec>& qubits_vecs
        );

    void set_noise_model(
        NOISE_MODEL model,
        GateType gate_type,
        double T1,
        double T2,
        double time_param
        );

    void set_noise_model(
        NOISE_MODEL model,
        GateType gate_type,
        double T1,
        double T2,
        double time_param,
        const QVec& qubits_vec
        );

    void set_noise_model(
        NOISE_MODEL model,
        GateType gate_type,
        double T1,
        double T2,
        double time_param,
        const std::vector<QVec>& qubits_vecs
        );

    void set_readout_error(
        const std::vector<std::vector<double>>& readout_params,
        const QVec& qubits
        );

    void set_measure_error(
        NOISE_MODEL model,
        double param
        );

    void set_measure_error(
        NOISE_MODEL model,
        double param,
        const QVec& qubits_vec
        );

    void set_measure_error(
        NOISE_MODEL model,
        double T1,
        double T2,
        double time_param
        );

    void set_measure_error(
        NOISE_MODEL model,
        double T1,
        double T2,
        double time_param,
        const QVec& qubits_vec
        );

    void set_rotation_error(double param);

    void set_reset_error(
        double reset_0_param,
        double reset_1_param
        );
};

Inherited Members

public:
    // methods

    virtual Qubit* allocateQubitThroughPhyAddress(size_t) = 0;
    virtual Qubit* allocateQubitThroughVirAddress(size_t) = 0;
    virtual void init() = 0;
    virtual QMachineStatus* getStatus() const = 0;
    virtual std::map<std::string, bool> directlyRun(QProg& qProg) = 0;
    virtual std::map<std::string, size_t> runWithConfiguration(QProg&, std::vector<ClassicalCondition>&, rapidjson::Document&) = 0;
    virtual std::map<std::string, size_t> runWithConfiguration(QProg&, std::vector<ClassicalCondition>&, int) = 0;
    virtual std::map<GateType, size_t> getGateTimeMap() const = 0;
    virtual void finalize() = 0;
    virtual QStat getQState() const = 0;
    virtual size_t getVirtualQubitAddress(Qubit*) const = 0;
    virtual bool swapQubitPhysicalAddress(Qubit*, Qubit*) = 0;
    virtual void setConfig(const Configuration&) = 0;
    virtual Qubit* allocateQubit() = 0;
    virtual QVec allocateQubits(size_t) = 0;
    virtual ClassicalCondition allocateCBit() = 0;
    virtual ClassicalCondition allocateCBit(size_t) = 0;
    virtual std::vector<ClassicalCondition> allocateCBits(size_t) = 0;
    virtual void Free_Qubit(Qubit*) = 0;
    virtual void Free_Qubits(QVec&) = 0;
    virtual void Free_CBit(ClassicalCondition&) = 0;
    virtual void Free_CBits(std::vector<ClassicalCondition>&) = 0;
    virtual size_t getAllocateQubit() = 0;
    virtual size_t getAllocateCMem() = 0;
    virtual void setConfigure(const Configuration&) = 0;
    virtual Qubit* qAlloc() = 0;
    virtual QVec qAllocMany(size_t qubit_count) = 0;
    virtual ClassicalCondition cAlloc() = 0;
    virtual ClassicalCondition cAlloc(size_t) = 0;
    virtual std::vector<ClassicalCondition> cAllocMany(size_t) = 0;
    virtual void qFree(Qubit*) = 0;
    virtual void qFreeAll(QVec&) = 0;
    virtual void cFree(ClassicalCondition&) = 0;
    virtual void cFreeAll(std::vector<ClassicalCondition>&) = 0;
    virtual size_t getAllocateQubitNum() = 0;
    virtual size_t getAllocateCMemNum() = 0;
    virtual void initState(const QStat& state = {}, const QVec& qlist = {}) = 0;
    virtual size_t get_allocate_qubits(QVec&) = 0;
    virtual size_t get_allocate_cbits(std::vector<ClassicalCondition>&) = 0;
    virtual double get_expectation(QProg, const QHamiltonian&, const QVec&) = 0;
    virtual double get_expectation(QProg, const QHamiltonian&, const QVec&, int) = 0;
    virtual void initState(const QStat& state = {}, const QVec& qlist = {});
    virtual Qubit* allocateQubitThroughPhyAddress(size_t);
    virtual Qubit* allocateQubitThroughVirAddress(size_t);
    virtual QMachineStatus* getStatus() const;
    virtual QResult* getResult();
    virtual std::map<std::string, bool> getResultMap();
    virtual void finalize();
    virtual std::map<std::string, bool> directlyRun(QProg& qProg);
    virtual std::map<std::string, size_t> runWithConfiguration(QProg&, std::vector<ClassicalCondition>&, rapidjson::Document&);
    virtual std::map<std::string, size_t> runWithConfiguration(QProg&, std::vector<ClassicalCondition>&, int);
    virtual std::map<std::string, size_t> runWithConfiguration(QProg&, std::vector<int>&, int);
    virtual std::map<GateType, size_t> getGateTimeMap() const;
    virtual QStat getQState() const;
    virtual size_t getVirtualQubitAddress(Qubit*) const;
    virtual bool swapQubitPhysicalAddress(Qubit*, Qubit*);
    virtual void set_random_engine(RandomEngine* rng);
    virtual void setConfig(const Configuration& config);
    virtual Qubit* allocateQubit();
    virtual QVec allocateQubits(size_t);
    virtual ClassicalCondition allocateCBit();
    virtual std::vector<ClassicalCondition> allocateCBits(size_t);
    virtual ClassicalCondition allocateCBit(size_t);
    virtual size_t getAllocateQubit();
    virtual size_t getAllocateCMem();
    virtual void Free_Qubit(Qubit*);
    virtual void Free_Qubits(QVec&);
    virtual void Free_CBit(ClassicalCondition&);
    virtual void Free_CBits(std::vector<ClassicalCondition>&);
    virtual void setConfigure(const Configuration&);
    virtual Qubit* qAlloc();
    virtual QVec qAllocMany(size_t qubit_count);
    virtual ClassicalCondition cAlloc();
    virtual ClassicalCondition cAlloc(size_t);
    virtual std::vector<ClassicalCondition> cAllocMany(size_t);
    virtual void qFree(Qubit*);
    virtual void qFreeAll(QVec&);
    virtual void cFree(ClassicalCondition&);
    virtual void cFreeAll(std::vector<ClassicalCondition>&);
    virtual size_t getAllocateQubitNum();
    virtual size_t getAllocateCMemNum();
    virtual size_t get_allocate_qubits(QVec&);
    virtual size_t get_allocate_cbits(std::vector<ClassicalCondition>&);
    virtual double get_expectation(QProg, const QHamiltonian&, const QVec&);
    virtual double get_expectation(QProg, const QHamiltonian&, const QVec&, int);
    virtual prob_vec PMeasure_no_index(QVec qubit_vector) = 0;
    virtual prob_tuple getProbTupleList(QVec, int) = 0;
    virtual prob_vec getProbList(QVec, int) = 0;
    virtual prob_dict getProbDict(QVec, int) = 0;
    virtual prob_tuple probRunTupleList(QProg&, QVec, int) = 0;
    virtual prob_vec probRunList(QProg&, QVec, int) = 0;
    virtual prob_dict probRunDict(QProg&, QVec, int) = 0;
    virtual std::map<std::string, size_t> quickMeasure(QVec, size_t) = 0;
    virtual prob_tuple PMeasure(QVec qubit_vector, int select_max) = 0;
    virtual QStat getQStat() = 0;
    virtual prob_tuple getProbTupleList(QVec, int selectMax = -1);
    virtual prob_vec getProbList(QVec, int selectMax = -1);
    virtual prob_dict getProbDict(QVec, int selectMax = -1);
    virtual prob_tuple probRunTupleList(QProg&, QVec, int selectMax = -1);
    virtual prob_vec probRunList(QProg&, QVec, int selectMax = -1);
    virtual prob_dict probRunDict(QProg&, QVec, int selectMax = -1);
    prob_tuple probRunTupleList(QProg&, const std::vector<int>&, int selectMax = -1);
    prob_vec probRunList(QProg&, const std::vector<int>&, int selectMax = -1);
    prob_dict probRunDict(QProg&, const std::vector<int>&, int selectMax = -1);
    virtual std::map<std::string, size_t> quickMeasure(QVec, size_t);
    virtual QStat getQStat();
    virtual prob_tuple PMeasure(QVec qubit_vector, int select_max);
    virtual prob_vec PMeasure_no_index(QVec qubit_vector);
    QStat getQState();
    prob_tuple pMeasure(QVec qubit_vector, int select_max);
    prob_vec pMeasureNoIndex(QVec qubit_vector);

    virtual void execute(
        std::shared_ptr<AbstractQGateNode> cur_node,
        std::shared_ptr<QNode> parent_node,
        Args&&... func_args
        );

    virtual void execute(
        std::shared_ptr<AbstractQuantumMeasure> cur_node,
        std::shared_ptr<QNode> parent_node,
        Args&&... func_args
        );

    virtual void execute(
        std::shared_ptr<AbstractQuantumReset> cur_node,
        std::shared_ptr<QNode> parent_node,
        Args&&... func_args
        );

    virtual void execute(
        std::shared_ptr<AbstractControlFlowNode> cur_node,
        std::shared_ptr<QNode> parent_node,
        Args&&... func_args
        );

    virtual void execute(
        std::shared_ptr<AbstractQuantumCircuit> cur_node,
        std::shared_ptr<QNode> parent_node,
        Args&&... func_args
        );

    virtual void execute(
        std::shared_ptr<AbstractQuantumProgram> cur_node,
        std::shared_ptr<QNode> parent_node,
        Args&&... func_args
        );

    virtual void execute(
        std::shared_ptr<AbstractClassicalProg> cur_node,
        std::shared_ptr<QNode> parent_node,
        Args&&... func_args
        );

Detailed Documentation

MPS quantum virtual machine.

Methods

virtual void init()

init

Returns:

void

virtual std::map<std::string, bool> directlyRun(QProg& qProg)

directlyRun

Parameters:

QProg&

quantum program

Returns:

std::map<std::string, bool>

virtual std::map<std::string, size_t> runWithConfiguration(
    QProg&,
    std::vector<ClassicalCondition>&,
    int
    )

runWithConfiguration

Parameters:

QProg&

quantum program

std::vector<ClassicalCondition>&

int

Returns:

std::map<std::string, Eigen::size_t>

virtual std::map<std::string, size_t> runWithConfiguration(
    QProg&,
    std::vector<ClassicalCondition>&,
    rapidjson::Document&
    )

runWithConfiguration

Parameters:

QProg&

quantum program

std::vector<ClassicalCondition>&

rapidjson::Document&

Returns:

std::map<std::string, Eigen::size_t>