1 from scipy.stats
import unitary_group
4 from squander
import utils
as utils
7 from squander.gates.qgd_Circuit_Wrapper
import qgd_Circuit_Wrapper
as Circuit
12 sigmax = sp.sparse.csr_matrix(np.array([[0,1],
14 sigmay = sp.sparse.csr_matrix(np.array([[0,0+-1j],
16 sigmaz = sp.sparse.csr_matrix(np.array([[1,0],
22 Hamiltonian = sp.sparse.coo_matrix((2**n, 2**n), dtype=np.complex128)
25 lhs_1 = sp.sparse.eye(1,format=
'coo')
27 lhs_1 = sp.sparse.eye(2,format=
'coo')
28 for k
in range(i[0]-1):
29 lhs_1 = sp.sparse.kron(lhs_1,sp.sparse.eye(2,format=
'coo'),format=
'coo')
31 rhs_1 = sp.sparse.eye(1,format=
'coo')
33 rhs_1 = sp.sparse.eye(2,format=
'coo')
34 for k
in range(n-i[0]-2):
35 rhs_1 = sp.sparse.kron(rhs_1,sp.sparse.eye(2,format=
'coo'),format=
'coo')
37 lhs_2 = sp.sparse.eye(1,format=
'coo')
39 lhs_2 = sp.sparse.eye(2,format=
'coo')
40 for k
in range(i[1]-1):
41 lhs_2 = sp.sparse.kron(lhs_2,sp.sparse.eye(2,format=
'coo'),format=
'coo')
43 rhs_2 = sp.sparse.eye(1,format=
'coo')
45 rhs_2 = sp.sparse.eye(2,format=
'coo')
46 for k
in range(n-i[1]-2):
47 rhs_2 = sp.sparse.kron(rhs_2,sp.sparse.eye(2,format=
'coo'),format=
'coo')
48 Hamiltonian += -0.5*sp.sparse.kron(sp.sparse.kron(lhs_1,sigmax,format=
'coo'),rhs_1,format=
'coo')@sp.sparse.kron(sp.sparse.kron(lhs_2 ,sigmax,format=
'coo'),rhs_2 ,format=
'coo')
49 Hamiltonian += -0.5*sp.sparse.kron(sp.sparse.kron(lhs_1,sigmay,format=
'coo'),rhs_1,format=
'coo')@sp.sparse.kron(sp.sparse.kron(lhs_2 ,sigmay,format=
'coo'),rhs_2 ,format=
'coo')
50 Hamiltonian += -0.5*sp.sparse.kron(sp.sparse.kron(lhs_1,sigmaz,format=
'coo'),rhs_1,format=
'coo')@sp.sparse.kron(sp.sparse.kron(lhs_2 ,sigmaz,format=
'coo'),rhs_2 ,format=
'coo')
54 lhs_1 = sp.sparse.eye(1,format=
'coo')
56 lhs_1 = sp.sparse.eye(2,format=
'coo')
58 lhs_1 = sp.sparse.kron(lhs_1,sp.sparse.eye(2,format=
'coo'),format=
'coo')
60 rhs_1 = sp.sparse.eye(1,format=
'coo')
62 rhs_1 = sp.sparse.eye(2,format=
'coo')
63 for k
in range(n-i-2):
64 rhs_1 = sp.sparse.kron(rhs_1,sp.sparse.eye(2,format=
'coo'),format=
'coo')
65 Hamiltonian += -0.5*sp.sparse.kron(sp.sparse.kron(lhs_1,sigmaz,format=
'coo'),rhs_1,format=
'coo')
68 return Hamiltonian.tocsr()
82 Hamiltonian = sp.sparse.eye(2**qbit_num,format=
"csr")
84 config = {
"agent_lifetime":500,
85 "optimization_tolerance": -7.1,
86 "max_inner_iterations":10,
88 "learning_rate": 2e-1,
90 "agent_exploration_rate":0.3,
91 "max_inner_iterations_adam":50000}
97 VQE_eye.set_Optimizer(
"GRAD_DESCEND")
100 VQE_eye.set_Ansatz(
"HEA")
103 VQE_eye.Generate_Circuit(layers, blocks)
106 param_num = VQE_eye.get_Parameter_Num()
107 parameters = np.random.random( (param_num,) )
109 VQE_eye.set_Optimized_Parameters(parameters)
112 VQE_eye.Start_Optimization()
115 quantum_circuit = VQE_eye.get_Qiskit_Circuit()
118 parameters = VQE_eye.get_Optimized_Parameters()
121 Energy = VQE_eye.Optimization_Problem( parameters )
124 assert (abs(Energy-1)<1e-4)
133 for idx
in range(qbit_num-1):
134 topology.append( (idx, idx+1) )
138 config = {
"agent_lifetime":10,
139 "max_inner_iterations":1000,
140 "max_iterations":1000,
142 "agent_exploration_rate":0.5,
143 "max_inner_iterations_adam":500,
144 "convergence_length": 300}
150 VQE_Heisenberg.set_Optimizer(
"AGENTS")
153 VQE_Heisenberg.set_Ansatz(
"HEA_ZYZ")
156 VQE_Heisenberg.Generate_Circuit(layers, blocks)
159 param_num = VQE_Heisenberg.get_Parameter_Num()
160 parameters = np.random.random( (param_num,) )
162 VQE_Heisenberg.set_Optimized_Parameters(parameters)
165 VQE_Heisenberg.Start_Optimization()
168 quantum_circuit = VQE_Heisenberg.get_Qiskit_Circuit()
171 lambdas, vecs = sp.sparse.linalg.eigs(Hamiltonian)
174 parameters = VQE_Heisenberg.get_Optimized_Parameters()
177 Energy = VQE_Heisenberg.Optimization_Problem( parameters )
179 print(
'Expected energy: ', np.real(lambdas[0]))
180 print(
'Obtained energy: ', Energy)
181 assert ((Energy - np.real(lambdas[0]))<1e-2)
def generate_hamiltonian(topology, n)
def test_Heisenberg_XX(self)
A base class to solve VQE problems This class can be used to approximate the ground state of the inpu...
def test_VQE_Identity(self)