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 = [[0,1],[0,4],[0,8],
34 oplist.append((
"XX",[i[0],i[1]],1))
35 oplist.append((
"YY",[i[0],i[1]],1))
36 oplist.append((
"ZZ",[i[0],i[1]],1))
38 oplist.append((
"Z",[i],1))
39 return SparsePauliOp.from_sparse_list(oplist,num_qubits=n).to_matrix(
True)
44 topology = random_regular_graph(3,n,seed=31415).edges
47 oplist.append((
"XX",[i[0],i[1]],1))
48 oplist.append((
"YY",[i[0],i[1]],1))
49 oplist.append((
"ZZ",[i[0],i[1]],1))
51 oplist.append((
"Z",[i],1))
52 return SparsePauliOp.from_sparse_list(oplist,num_qubits=n).to_matrix(
True)
74 [eigvals, eigvecs] = sp.sparse.linalg.eigs( Hamiltonian, k=10, which=
'SR' )
75 eigval = np.real(eigvals[0])
78 print(
'The target eigenvalue is: ', eigval )
82 config = {
"max_inner_iterations":800,
84 "convergence_length": 20}
87 VQE_Heisenberg = Variational_Quantum_Eigensolver(Hamiltonian, qbit_num, config, accelerator_num=1)
90 VQE_Heisenberg.set_Optimizer(
"COSINE")
93 VQE_Heisenberg.set_Ansatz(
"HEA_ZYZ")
96 VQE_Heisenberg.Generate_Circuit( layers, inner_blocks)
99 param_num = VQE_Heisenberg.get_Parameter_Num()
100 print(
'The number of free parameters is: ', str(param_num) )
103 parameters = np.random.randn( param_num )*2*np.pi
105 VQE_Heisenberg.set_Optimized_Parameters(parameters)
111 page_entropy = 2 * np.log(2.0) - 1.0/( pow(2, qbit_num-2*2+1) )
112 entropy_exact_gs = VQE_Heisenberg.get_Second_Renyi_Entropy( parameters=np.array([]), qubit_list=[0,1], input_state=eigvec )
113 normalized_entropy_exact_gs = entropy_exact_gs/page_entropy
114 print(
'The normalized entropy of the exact ground state evaluated on qubits 0 and 1 is:', normalized_entropy_exact_gs)
117 print(
' ', flush=
True)
119 for iter_idx
in range(400):
122 VQE_Heisenberg.Start_Optimization()
125 parameters = VQE_Heisenberg.get_Optimized_Parameters()
128 VQE_energy = VQE_Heisenberg.Optimization_Problem( parameters )
133 page_entropy = len(qubit_list) * np.log(2.0) - 1.0/( pow(2, qbit_num-2*len(qubit_list)+1) )
134 entropy = VQE_Heisenberg.get_Second_Renyi_Entropy( parameters=parameters, qubit_list=qubit_list )
135 normalized_entropy = entropy/page_entropy
138 print(
'Current VQE energy: ', VQE_energy,
' normalized entropy: ', normalized_entropy)
140 np.save(
'Heisenberg_VQE_data.npy', parameters, topology )
142 initial_state = np.zeros( (1 << qbit_num), dtype=np.complex128 )
143 initial_state[0] = 1.0 + 0j
146 state_to_transform = initial_state.copy()
147 VQE_Heisenberg.apply_to( parameters, state_to_transform );
149 overlap = state_to_transform.transpose().conjugate() @ eigvecs
150 overlap_norm = np.real(overlap * overlap.conjugate())
152 for idx
in range( overlap_norm.size) :
153 print(
'The overlap integral with the exact eigenstates of energy ', eigvals[idx],
' is: ', overlap_norm[idx] )
155 print(
'The sum of the calculated overlaps: ', np.sum(overlap_norm ) )
158 if ( VQE_energy < 0.99*eigval):
def generate_hamiltonian(n)
def generate_hamiltonian_tmp(n)