1 from scipy.stats
import unitary_group
3 from squander
import Variational_Quantum_Eigensolver
4 from squander
import utils
as utils
9 from networkx.generators.random_graphs
import random_regular_graph
10 from qiskit.quantum_info
import SparsePauliOp
12 np.set_printoptions(linewidth=200)
22 topology = random_regular_graph(3,n,seed=31415).edges
26 oplist.append((
"XX",[i[0],i[1]],1))
27 oplist.append((
"YY",[i[0],i[1]],1))
28 oplist.append((
"ZZ",[i[0],i[1]],1))
30 oplist.append((
"Z",[i],1))
31 return SparsePauliOp.from_sparse_list(oplist,num_qubits=n).to_matrix(
True)
36 topology = random_regular_graph(3,n,seed=31415).edges
39 oplist.append((
"XX",[i[0],i[1]],1))
40 oplist.append((
"YY",[i[0],i[1]],1))
41 oplist.append((
"ZZ",[i[0],i[1]],1))
43 oplist.append((
"Z",[i],1))
44 return SparsePauliOp.from_sparse_list(oplist,num_qubits=n).to_matrix(
True)
51 from squander
import Circuit
53 ret = Circuit( qbit_num )
56 for layer_idx
in range(layers) :
59 for int
in range(inner_blocks):
61 block1 = Circuit( qbit_num )
62 block2 = Circuit( qbit_num )
73 ret.add_Circuit( block1 )
74 ret.add_Circuit( block2 )
79 for control_qbit
in range(1, qbit_num-1, 2):
81 if control_qbit+2<qbit_num :
83 for int
in range(inner_blocks):
87 block1 = Circuit( qbit_num )
88 block2 = Circuit( qbit_num )
90 block1.add_RZ( control_qbit+1 )
91 block1.add_RY( control_qbit+1 )
92 block1.add_RZ( control_qbit+1 )
94 block2.add_RZ( control_qbit+2 )
95 block2.add_RY( control_qbit+2 )
96 block2.add_RZ( control_qbit+2 )
99 ret.add_Circuit( block1 )
100 ret.add_Circuit( block2 )
102 ret.add_CNOT(control_qbit+2,control_qbit+1);
106 for int
in range(inner_blocks):
110 block1 = Circuit( qbit_num )
111 block2 = Circuit( qbit_num )
113 block1.add_RZ( control_qbit+1 )
114 block1.add_RY( control_qbit+1 )
115 block1.add_RZ( control_qbit+1 )
117 block2.add_RZ( control_qbit )
118 block2.add_RY( control_qbit )
119 block2.add_RZ( control_qbit )
122 ret.add_Circuit( block1 )
123 ret.add_Circuit( block2 )
125 ret.add_CNOT(control_qbit+1,control_qbit);
150 [eigvals, eigvecs] = sp.sparse.linalg.eigs( Hamiltonian, k=10, which=
'SR' )
151 eigval = np.real(eigvals[0])
152 eigvec = eigvecs[:,0]
154 print(
'The target eigenvalue is: ', eigval )
158 config = {
"max_inner_iterations":800,
160 "convergence_length": 20}
163 VQE_Heisenberg = Variational_Quantum_Eigensolver(Hamiltonian, qbit_num, config)
166 VQE_Heisenberg.set_Optimizer(
"COSINE")
169 VQE_Heisenberg.set_Gate_Structure( squander_circuit )
172 param_num = VQE_Heisenberg.get_Parameter_Num()
173 print(
'The number of free parameters is: ', str(param_num) )
175 parameters = np.load(
'COSINE_1000x1_layers_Heisenberg_16_3point_zero_init_3overlap0.8602661822824491.npy' )
177 VQE_Heisenberg.set_Optimized_Parameters(parameters)
183 page_entropy = 2 * np.log(2.0) - 1.0/( pow(2, qbit_num-2*2+1) )
184 entropy_exact_gs = VQE_Heisenberg.get_Second_Renyi_Entropy( parameters=np.array([]), qubit_list=[0,1], input_state=eigvec )
185 normalized_entropy_exact_gs = entropy_exact_gs/page_entropy
186 print(
'The normalized entropy of the exact ground state evaluated on qubits 0 and 1 is:', normalized_entropy_exact_gs)
189 print(
' ', flush=
True)
193 VQE_energy = VQE_Heisenberg.Optimization_Problem( parameters )
198 page_entropy = len(qubit_list) * np.log(2.0) - 1.0/( pow(2, qbit_num-2*len(qubit_list)+1) )
199 entropy = VQE_Heisenberg.get_Second_Renyi_Entropy( parameters=parameters, qubit_list=qubit_list )
200 normalized_entropy = entropy/page_entropy
203 print(
'Current VQE energy: ', VQE_energy,
' normalized entropy: ', normalized_entropy)
206 initial_state = np.zeros( (1 << qbit_num), dtype=np.complex128 )
207 initial_state[0] = 1.0 + 0j
210 state_to_transform = initial_state.copy()
211 VQE_Heisenberg.apply_to( parameters, state_to_transform );
215 overlap = state_to_transform.transpose().conjugate() @ eigvecs
216 overlap_norm = np.real(overlap * overlap.conjugate())
218 for idx
in range( overlap_norm.size) :
219 print(
'The overlap integral with the exact eigenstates of energy ', eigvals[idx],
' is: ', overlap_norm[idx] )
221 print(
'The sum of the calculated overlaps: ', np.sum(overlap_norm ) )
def generate_hamiltonian_tmp(n)
def generate_circuit_ansatz(layers, inner_blocks, qbit_num)
def generate_hamiltonian(n)