class QuantumError

#include <NoiseModel.h>

class QuantumError
{
public:
    // typedefs

    typedef std::vector<std::vector<size_t>> noise_qubits_t;

    // construction

    QuantumError();

    QuantumError(
        const NOISE_MODEL& model,
        double prob,
        size_t qubit_num
        );

    // methods

    void set_noise(
        const NOISE_MODEL& model,
        double prob,
        size_t qubit_num
        );

    void set_noise(
        const NOISE_MODEL& model,
        double T1,
        double T2,
        double t_gate,
        size_t qubit_num
        );

    void set_noise(
        const NOISE_MODEL& model,
        const std::vector<QStat>& unitary_matrices,
        const std::vector<double>& probs,
        size_t qubit_num
        );

    void set_noise(
        const NOISE_MODEL& model,
        const std::vector<QStat>& unitary_matrices,
        size_t qubit_num
        );

    void set_reset_error(
        double p0,
        double p1
        );

    void set_readout_error(
        const std::vector<std::vector<double>>& probs_list,
        size_t qubit_num
        );

    bool sample_noise(
        NOISE_MODEL& model,
        NoiseOp& noise_ops,
        Qnum& noise_qubits,
        RandomEngine19937& rng
        );

    bool sample_noise(
        NoiseOp& noise_ops,
        Qnum& noise_qubits,
        RandomEngine19937& rng
        );

    bool sample_readout(std::vector<std::vector<double>>& readout);
    void set_qubit_num(int num);
    int get_qubit_num() const;
    bool _optimize_ops(NoiseOp& ops);
    NOISE_MODEL get_noise_model();
};