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