diff --git a/paddle_quantum/circuit.py b/paddle_quantum/circuit.py index 2eba39f84a900b6294c97dc01585ec2e47ebadae..d027f69043fe3b12dc733096adf573fdb01962ea 100644 --- a/paddle_quantum/circuit.py +++ b/paddle_quantum/circuit.py @@ -26,7 +26,7 @@ from paddle import imag, real, reshape, kron, matmul, trace from paddle_quantum.utils import partial_trace, dagger, pauli_str_to_matrix from paddle_quantum import shadow from paddle_quantum.intrinsic import * -from paddle_quantum.state import density_op +from paddle_quantum.state import density_op,vec __all__ = [ "UAnsatz", @@ -60,6 +60,29 @@ class UAnsatz: # Record history of adding gates to the circuit self.__history = [] + def expand(self,new_n): + """ + 为原来的量子电路进行比特数扩展 + + Args: + new_n(int):扩展后的量子比特数 + """ + assert new_n>=self.n,'扩展后量子比特数要大于原量子比特数' + diff = new_n-self.n + dim = 2**diff + if self.__state is not None: + if self.__run_mode=='density_matrix': + shape = (dim,dim) + _state = paddle.to_tensor(density_op(diff)) + elif self.__run_mode=='state_vector': + shape = (dim,) + _state = paddle.to_tensor(vec(0,diff)) + + _state= paddle.reshape(_state,shape) + _state = kron(self.__state,_state) + self.__state = _state + self.n = new_n + def __add__(self, cir): r"""重载加法 ‘+’ 运算符,用于拼接两个维度相同的电路 diff --git a/paddle_quantum/utils.py b/paddle_quantum/utils.py index d1d0ffe22432ca13f604e08ddc011b8fe3f6225f..11534dc3a3b0d0959b7b141b92b8d001a25711e9 100644 --- a/paddle_quantum/utils.py +++ b/paddle_quantum/utils.py @@ -916,17 +916,21 @@ class Hamiltonian: pass return self.coefficients, self.__pauli_words - def construct_h_matrix(self): + def construct_h_matrix(self, n_qubit=None): r"""构建 Hamiltonian 在 Z 基底下的矩阵。 Returns: np.ndarray: Z 基底下的哈密顿量矩阵形式 """ coefs, pauli_words, sites = self.decompose_with_sites() - n_qubit = 1 - for site in sites: - if type(site[0]) is int: - n_qubit = max(n_qubit, max(site) + 1) + if n_qubit is None: + n_qubit = 1 + for site in sites: + if type(site[0]) is int: + print(n_qubit,(site)) + n_qubit = max(n_qubit, max(site) + 1) + else: + assert n_qubit>=self.n_qubits,"输入的量子数不小于哈密顿量表达式中所对应的量子比特数" h_matrix = np.zeros([2 ** n_qubit, 2 ** n_qubit], dtype='complex64') spin_ops = SpinOps(n_qubit, use_sparse=True) for idx in range(len(coefs)): diff --git a/test_and_documents/readme.md b/test_and_documents/readme.md new file mode 100644 index 0000000000000000000000000000000000000000..f8d685c16e9c38d7a45549471b137d378b5a50cc --- /dev/null +++ b/test_and_documents/readme.md @@ -0,0 +1 @@ +通过在UAnsatz类中添加新的成员函数expand来实现扩展 diff --git a/test_and_documents/test.py b/test_and_documents/test.py new file mode 100644 index 0000000000000000000000000000000000000000..9d998d8fcc7d6b1051c73bb1338a68f7c50de3c4 --- /dev/null +++ b/test_and_documents/test.py @@ -0,0 +1,34 @@ +from paddle_quantum.circuit import UAnsatz +from paddle import kron +from paddle_quantum.state import vec,density_op +import paddle + + +#density_matrix +def test_density_matrix(): + cir = UAnsatz(1) + cir.ry(paddle.to_tensor(1,dtype='float64'),0) + state = cir.run_density_matrix() + cir.expand(3) + print(cir.get_state()) + + cir2 = UAnsatz(3) + cir2.ry(paddle.to_tensor(1,dtype='float64'),0) + cir2.run_density_matrix() + print(cir2.get_state()) + +#state_vector +def test_state_vector(): + cir = UAnsatz(1) + cir.ry(paddle.to_tensor(1,dtype='float64'),0) + state = cir.run_state_vector() + cir.expand(3) + print(cir.get_state()) + + cir2 = UAnsatz(3) + cir2.ry(paddle.to_tensor(1,dtype='float64'),0) + cir2.run_state_vector() + print(cir2.get_state()) + +test_density_matrix() +test_state_vector() diff --git a/test_documents/test_construct_h_matrix.py b/test_documents/test_construct_h_matrix.py new file mode 100644 index 0000000000000000000000000000000000000000..399de2270bcfc01fd6c6295b2265205e98b2bab5 --- /dev/null +++ b/test_documents/test_construct_h_matrix.py @@ -0,0 +1,6 @@ +from paddle_quantum.utils import Hamiltonian + +h = Hamiltonian([(1, 'Z0, Z1')]) + +print(h.construct_h_matrix()) +print(h.construct_h_matrix(4))