.. index:: pair: class; QPanda::MPSImplQPU .. _doxid-class_q_panda_1_1_m_p_s_impl_q_p_u: class QPanda::MPSImplQPU ======================== .. toctree:: :hidden: Overview ~~~~~~~~ QPU implementation by MPS model. :ref:`More...` .. ref-code-block:: cpp :class: doxyrest-overview-code-block #include class MPSImplQPU: public :ref:`QPUImpl` { public: // fields std::vector<:ref:`MPS_Tensor`> :ref:`m_qubits_tensor`; std::vector<:ref:`rvector_t`> :ref:`m_lambdas`; // methods size_t :target:`get_qubit_num`(); virtual bool :target:`qubitMeasure`(size_t qn); virtual :ref:`QError` :target:`pMeasure`( :ref:`Qnum`& qnum, :ref:`prob_vec`& mResult ); virtual :ref:`QError` :target:`initState`( size_t head_rank, size_t rank_size, size_t qubit_num ); void :target:`initState`(const MPSImplQPU& other); virtual :ref:`QError` :target:`initState`( size_t qubit_num, const :ref:`QStat`& state = {} ); void :ref:`initState_from_matrix`(size_t num_qubits, const :ref:`cmatrix_t`& mat); virtual :ref:`QError` :ref:`unitarySingleQubitGate`(size_t qn, :ref:`QStat`& matrix, bool isConjugate, :ref:`GateType`); virtual :ref:`QError` :ref:`controlunitarySingleQubitGate`(size_t qn, :ref:`Qnum`& qnum, :ref:`QStat`& matrix, bool isConjugate, :ref:`GateType`); virtual :ref:`QError` :ref:`unitaryDoubleQubitGate`(size_t qn_0, size_t qn_1, :ref:`QStat`& matrix, bool isConjugate, :ref:`GateType`); virtual :ref:`QError` :ref:`controlunitaryDoubleQubitGate`(size_t qn_0, size_t qn_1, :ref:`Qnum`& qnum, :ref:`QStat`& matrix, bool isConjugate, :ref:`GateType`); virtual :ref:`QStat` :ref:`getQState`(); virtual :ref:`QError` :ref:`Reset`(size_t qn); size_t :ref:`get_qubit_index`(size_t index) const; void :ref:`change_qubits_location`(size_t src, size_t dst); void :ref:`swap_qubits_location`(size_t index_A, size_t index_B); bool :ref:`measure_one_collapsing`(size_t qubit); std::vector> :ref:`measure_all_noncollapsing`(:ref:`Qnum` measure_qubits, int shots); :ref:`cmatrix_t` :ref:`mul_v_by_s`(const :ref:`cmatrix_t`& mat, const :ref:`rvector_t`& lambda); :ref:`MPS_Tensor` :ref:`convert_qstate_to_mps_form`(size_t first_index, size_t last_index); void :ref:`centralize_and_sort_qubits`(const :ref:`Qnum`& qubits, :ref:`Qnum`& sorted_indices, :ref:`Qnum`& centralized_qubits); void :ref:`move_all_qubits_to_sorted_ordering`(); void :ref:`move_qubits_to_right_end`(const :ref:`Qnum`& qubits, :ref:`Qnum`& target_qubits, :ref:`Qnum`& actual_indices); void :ref:`execute_one_qubit_gate`(size_t qn, const :ref:`cmatrix_t`& mat); void :ref:`execute_two_qubit_gate`(size_t qn_0, size_t qn_1, const :ref:`cmatrix_t`& mat); void :ref:`execute_multi_qubit_gate`(const :ref:`Qnum`& qubits, const :ref:`cmatrix_t`& mat); :ref:`qcomplex_t` :target:`expectation_value_pauli`(const :ref:`Qnum`& qubits); :ref:`qcomplex_t` :target:`expectation_value_pauli_internal`( const :ref:`Qnum`& qubits, const std::vector<:ref:`GateType`>& matrices, size_t first_index, size_t last_index, size_t num_Is ); bool :target:`apply_measure`(size_t qubit); :ref:`Qnum` :target:`apply_measure`(:ref:`Qnum` qubits); :ref:`cmatrix_t` :target:`density_matrix`(const :ref:`Qnum`& qubits); double :target:`expectation_value`( const :ref:`Qnum`& qubits, const :ref:`cmatrix_t`& matrix ); double :target:`single_expectation_value`( const :ref:`Qnum`& qubits, const :ref:`cmatrix_t`& matrix ); double :target:`double_expectation_value`( const :ref:`Qnum`& qubits, const :ref:`cmatrix_t`& matrix ); void :target:`unitaryQubitGate`( :ref:`Qnum` qubits, :ref:`QStat` matrix, bool isConjugate ); :ref:`qcomplex_t` :target:`pmeasure_bin_index`(std::string str); :ref:`qcomplex_t` :target:`pmeasure_dec_index`(std::string str); :ref:`QStat` :target:`pmeasure_bin_subset`(const std::vector& bin_strs); :ref:`QStat` :target:`pmeasure_dec_subset`(const std::vector& dec_strs); }; Inherited Members ----------------- .. ref-code-block:: cpp :class: doxyrest-overview-inherited-code-block public: // methods virtual bool :ref:`qubitMeasure`(size_t qn) = 0; virtual :ref:`QError` :ref:`pMeasure`(:ref:`Qnum`& qnum, :ref:`prob_vec`& mResult) = 0; virtual :ref:`QError` :ref:`initState`(size_t head_rank, size_t rank_size, size_t qubit_num) = 0; virtual :ref:`QError` :ref:`initState`(size_t qubit_num, const :ref:`QStat`& state = {}) = 0; virtual :ref:`QError` :ref:`unitarySingleQubitGate`(size_t qn, :ref:`QStat`& matrix, bool isConjugate, :ref:`GateType`) = 0; virtual :ref:`QError` :ref:`controlunitarySingleQubitGate`(size_t qn, :ref:`Qnum`& qnum, :ref:`QStat`& matrix, bool isConjugate, :ref:`GateType`) = 0; virtual :ref:`QError` :ref:`unitaryDoubleQubitGate`(size_t qn_0, size_t qn_1, :ref:`QStat`& matrix, bool isConjugate, :ref:`GateType`) = 0; virtual :ref:`QError` :ref:`controlunitaryDoubleQubitGate`(size_t qn_0, size_t qn_1, :ref:`Qnum`& qnum, :ref:`QStat`& matrix, bool isConjugate, :ref:`GateType`) = 0; virtual :ref:`QStat` :ref:`getQState`() = 0; virtual void :ref:`set_random_engine`(:ref:`RandomEngine`* rng); virtual double :ref:`get_random_double`(); virtual :ref:`QError` :ref:`Reset`(size_t qn) = 0; .. _details-class_q_panda_1_1_m_p_s_impl_q_p_u: Detailed Documentation ~~~~~~~~~~~~~~~~~~~~~~ QPU implementation by MPS model. Fields ------ .. index:: pair: variable; m_qubits_tensor .. _doxid-class_q_panda_1_1_m_p_s_impl_q_p_u_1a4177a567c0847c3862a8509789311444: .. ref-code-block:: cpp :class: doxyrest-title-code-block std::vector<:ref:`MPS_Tensor`> m_qubits_tensor the tensor of qubits. .. index:: pair: variable; m_lambdas .. _doxid-class_q_panda_1_1_m_p_s_impl_q_p_u_1acff6e9301157771849970a243fb2f099: .. ref-code-block:: cpp :class: doxyrest-title-code-block std::vector<:ref:`rvector_t`> m_lambdas lambdas between tensors. Methods ------- .. index:: pair: function; initState_from_matrix .. _doxid-class_q_panda_1_1_m_p_s_impl_q_p_u_1a59de06132c0460f46ce8287da8cfefb5: .. ref-code-block:: cpp :class: doxyrest-title-code-block void initState_from_matrix(size_t num_qubits, const :ref:`cmatrix_t`& mat) init state from matrix .. rubric:: Parameters: .. list-table:: :widths: 20 80 * - size_t - number of qubits * - cmatrix_t - matrix .. index:: pair: function; unitarySingleQubitGate .. _doxid-class_q_panda_1_1_m_p_s_impl_q_p_u_1aa6fbee340ea0f6ba9c6db9ec2d09cccc: .. ref-code-block:: cpp :class: doxyrest-title-code-block virtual :ref:`QError` unitarySingleQubitGate(size_t qn, :ref:`QStat`& matrix, bool isConjugate, :ref:`GateType`) unitary single qubit gate .. rubric:: Parameters: .. list-table:: :widths: 20 80 * - size_t - qubit address * - QStat& - matrix * - bool - state of conjugate * - GateType - gate type .. rubric:: Returns: QError .. index:: pair: function; controlunitarySingleQubitGate .. _doxid-class_q_panda_1_1_m_p_s_impl_q_p_u_1a7b905c2b1b33a2ddb4c935f4ba726994: .. ref-code-block:: cpp :class: doxyrest-title-code-block virtual :ref:`QError` controlunitarySingleQubitGate( size_t qn, :ref:`Qnum`& qnum, :ref:`QStat`& matrix, bool isConjugate, :ref:`GateType` ) controlunitary single qubit gate .. rubric:: Parameters: .. list-table:: :widths: 20 80 * - size_t - qubit address * - Qnum& - control qubit addresses * - QStat - & matrix * - bool - state of conjugate * - GateType - gate type .. rubric:: Returns: QError .. index:: pair: function; unitaryDoubleQubitGate .. _doxid-class_q_panda_1_1_m_p_s_impl_q_p_u_1a4ca05e827d2e27f7473b5bb38a90be36: .. ref-code-block:: cpp :class: doxyrest-title-code-block virtual :ref:`QError` unitaryDoubleQubitGate( size_t qn_0, size_t qn_1, :ref:`QStat`& matrix, bool isConjugate, :ref:`GateType` ) unitary double qubit gate .. rubric:: Parameters: .. list-table:: :widths: 20 80 * - size_t - first qubit address * - size_t - second qubit address * - QStat& - matrix * - bool - state of conjugate * - GateType - gate type .. rubric:: Returns: QError .. index:: pair: function; controlunitaryDoubleQubitGate .. _doxid-class_q_panda_1_1_m_p_s_impl_q_p_u_1a422cc477aca1e1f7f1af561a43b927f3: .. ref-code-block:: cpp :class: doxyrest-title-code-block virtual :ref:`QError` controlunitaryDoubleQubitGate( size_t qn_0, size_t qn_1, :ref:`Qnum`& qnum, :ref:`QStat`& matrix, bool isConjugate, :ref:`GateType` ) controlunitary double qubit gate .. rubric:: Parameters: .. list-table:: :widths: 20 80 * - size_t - first qubit address * - size_t - second qubit address * - Qnum& - control qubit addresses * - QStat& - quantum states * - bool - state of conjugate * - GateType - gate type .. rubric:: Returns: QError .. index:: pair: function; getQState .. _doxid-class_q_panda_1_1_m_p_s_impl_q_p_u_1a0da50982b3322da7cce65fe69467bf09: .. ref-code-block:: cpp :class: doxyrest-title-code-block virtual :ref:`QStat` getQState() get quantum states .. rubric:: Returns: QStat quantum states .. index:: pair: function; Reset .. _doxid-class_q_panda_1_1_m_p_s_impl_q_p_u_1a59f168807624e698df54caf07d37bef8: .. ref-code-block:: cpp :class: doxyrest-title-code-block virtual :ref:`QError` Reset(size_t qn) reset qubit .. rubric:: Parameters: .. list-table:: :widths: 20 80 * - size_t - qubit address .. index:: pair: function; get_qubit_index .. _doxid-class_q_panda_1_1_m_p_s_impl_q_p_u_1a20bb4c8b31a599cd4e89c7be36a11336: .. ref-code-block:: cpp :class: doxyrest-title-code-block size_t get_qubit_index(size_t index) const gets the position of the qubits in MPS form .. rubric:: Parameters: .. list-table:: :widths: 20 80 * - size_t - qubits index .. rubric:: Returns: size_t the position on m_qubits_location .. index:: pair: function; change_qubits_location .. _doxid-class_q_panda_1_1_m_p_s_impl_q_p_u_1a5dc06d8c2b179114483fc49d077159bc: .. ref-code-block:: cpp :class: doxyrest-title-code-block void change_qubits_location(size_t src, size_t dst) change two qubits .. rubric:: Parameters: .. list-table:: :widths: 20 80 * - size_t - src qubit location * - size_t - dst qubit location .. index:: pair: function; swap_qubits_location .. _doxid-class_q_panda_1_1_m_p_s_impl_q_p_u_1ad628319764e400f6ef8e16c4af0110c4: .. ref-code-block:: cpp :class: doxyrest-title-code-block void swap_qubits_location(size_t index_A, size_t index_B) execute SWAP gate, the state of swapping two qubits .. rubric:: Parameters: .. list-table:: :widths: 20 80 * - size_t - A qubit index * - size_t - B qubit index .. index:: pair: function; measure_one_collapsing .. _doxid-class_q_panda_1_1_m_p_s_impl_q_p_u_1a6bc770db40b9d280e26ac20645d89f76: .. ref-code-block:: cpp :class: doxyrest-title-code-block bool measure_one_collapsing(size_t qubit) measure one qubit collapsing .. rubric:: Parameters: .. list-table:: :widths: 20 80 * - size_t - the qubit position of the measurement .. rubric:: Returns: bool the measurement results .. index:: pair: function; measure_all_noncollapsing .. _doxid-class_q_panda_1_1_m_p_s_impl_q_p_u_1a10abb872a7a1f3d8f2ba4ba8c62addec: .. ref-code-block:: cpp :class: doxyrest-title-code-block std::vector> measure_all_noncollapsing( :ref:`Qnum` measure_qubits, int shots ) measure all qubits collapsing .. rubric:: Parameters: .. list-table:: :widths: 20 80 * - size_t - the qubit position of the measurement .. rubric:: Returns: std::vector> the measurement results .. index:: pair: function; mul_v_by_s .. _doxid-class_q_panda_1_1_m_p_s_impl_q_p_u_1aa21344607cac37da4db3c72681772793: .. ref-code-block:: cpp :class: doxyrest-title-code-block :ref:`cmatrix_t` mul_v_by_s(const :ref:`cmatrix_t`& mat, const :ref:`rvector_t`& lambda) after the SVD decomposition , The product of S and V .. rubric:: Parameters: .. list-table:: :widths: 20 80 * - cmatrix_t - V matrix * - rvector_t - S vector .. rubric:: Returns: cmatrix_t product .. index:: pair: function; convert_qstate_to_mps_form .. _doxid-class_q_panda_1_1_m_p_s_impl_q_p_u_1a83f6ba3379f146ff833cab001d63899d: .. ref-code-block:: cpp :class: doxyrest-title-code-block :ref:`MPS_Tensor` convert_qstate_to_mps_form(size_t first_index, size_t last_index) convert to MPS form .. rubric:: Parameters: .. list-table:: :widths: 20 80 * - size_t - starting position * - size_t - end position .. rubric:: Returns: :ref:`MPS_Tensor ` MPS form tensor .. index:: pair: function; centralize_and_sort_qubits .. _doxid-class_q_panda_1_1_m_p_s_impl_q_p_u_1aec9f860c3b99eb41335a335447e14d9e: .. ref-code-block:: cpp :class: doxyrest-title-code-block void centralize_and_sort_qubits( const :ref:`Qnum`& qubits, :ref:`Qnum`& sorted_indices, :ref:`Qnum`& centralized_qubits ) sort qubits location, and centralize qubits locations .. rubric:: Parameters: .. list-table:: :widths: 20 80 * - Qnum - original qubits location * - Qnum - sorted indices * - Qnum - centralized qubits location .. index:: pair: function; move_all_qubits_to_sorted_ordering .. _doxid-class_q_panda_1_1_m_p_s_impl_q_p_u_1a90042d22202dfc73554d74faa83ef7c7: .. ref-code-block:: cpp :class: doxyrest-title-code-block void move_all_qubits_to_sorted_ordering() move all qubits to sorted ordering .. index:: pair: function; move_qubits_to_right_end .. _doxid-class_q_panda_1_1_m_p_s_impl_q_p_u_1a1c3d07de1001000731ebbd2bbad34d7b: .. ref-code-block:: cpp :class: doxyrest-title-code-block void move_qubits_to_right_end(const :ref:`Qnum`& qubits, :ref:`Qnum`& target_qubits, :ref:`Qnum`& actual_indices) move qubits to right_end location .. rubric:: Parameters: .. list-table:: :widths: 20 80 * - Qnum - original qubits location * - Qnum - target qubits location * - actual - indices .. index:: pair: function; execute_one_qubit_gate .. _doxid-class_q_panda_1_1_m_p_s_impl_q_p_u_1a1d3010aa70bfd5b88074c88cafc06dcd: .. ref-code-block:: cpp :class: doxyrest-title-code-block void execute_one_qubit_gate(size_t qn, const :ref:`cmatrix_t`& mat) execute one qubit gate .. rubric:: Parameters: .. list-table:: :widths: 20 80 * - size_t - target qubit * - cmatrix_t - gate matrix .. index:: pair: function; execute_two_qubit_gate .. _doxid-class_q_panda_1_1_m_p_s_impl_q_p_u_1abef0952b71cee3548c30ea3d1d5ce782: .. ref-code-block:: cpp :class: doxyrest-title-code-block void execute_two_qubit_gate(size_t qn_0, size_t qn_1, const :ref:`cmatrix_t`& mat) execute two qubits gate .. rubric:: Parameters: .. list-table:: :widths: 20 80 * - size_t - control qubit * - size_t - target qubit * - cmatrix_t - gate matrix .. index:: pair: function; execute_multi_qubit_gate .. _doxid-class_q_panda_1_1_m_p_s_impl_q_p_u_1a623c56e9a2d2853f98bba4c7cdaa2da5: .. ref-code-block:: cpp :class: doxyrest-title-code-block void execute_multi_qubit_gate(const :ref:`Qnum`& qubits, const :ref:`cmatrix_t`& mat) execute multi qubits gate .. rubric:: Parameters: .. list-table:: :widths: 20 80 * - size_t - control and target qubits, target qubit in the tail * - cmatrix_t - gate matrix