def build_hamiltonian_operators(self, qubit_mapping, two_qubit_reduction, epsilon, num_particles): self.M_h_elements = [] self.Q_h_elements = [] self.times_MQ_h = [] for (I, J) in self.elements: t0 = time.time() EI, EJ = self.E_mu[I], self.E_mu[J] MIJ_oper, MIJ_idx = triple_commutator_adj_twobody_nor( self.n, EI, EJ, self.h) QIJ_oper, QIJ_idx = triple_commutator_adj_twobody_adj( self.n, EI, EJ, self.h) t1 = time.time() self.logfile.write( "M,Q elements (H) %d %d --- time for FermionicOperator %f\n" % (I, J, t1 - t0)) MIJ_oper = MIJ_oper.mapping(map_type=qubit_mapping.value, threshold=epsilon, idx=MIJ_idx) QIJ_oper = QIJ_oper.mapping(map_type=qubit_mapping.value, threshold=epsilon, idx=QIJ_idx) if qubit_mapping == 'parity' and two_qubit_reduction: MIJ_oper = Z2Symmetries.two_qubit_reduction( MIJ_oper, num_particles) QIJ_oper = Z2Symmetries.two_qubit_reduction( QIJ_oper, num_particles) self.M_h_elements.append(MIJ_oper) self.Q_h_elements.append(QIJ_oper) t2 = time.time() self.times_MQ_h.append((I, J, t1 - t0, t2 - t1)) self.logfile.write( "M,Q elements (H) %d %d --- time for Mapping %f\n" % (I, J, t2 - t1))
def build_operators(self, task, qubit_mapping, two_qubit_reduction, num_particles, epsilon): self.matrix_elements_adj_nor[task] = [] self.matrix_elements_adj_adj[task] = [] self.time_statistics[task] = [] # ----- for (I, J) in self.elements: # ----- computation t0 = time.time() EI, EJ = self.E_mu[I], self.E_mu[J] if (task == 'overlap'): adj_nor_oper, adj_nor_idx = commutator_adj_nor(self.n, EI, EJ) adj_adj_oper, adj_adj_idx = commutator_adj_adj(self.n, EI, EJ) if (task == 'hamiltonian'): adj_nor_oper, adj_nor_idx = triple_commutator_adj_twobody_nor( self.n, EI, EJ, self.h) adj_adj_oper, adj_adj_idx = triple_commutator_adj_twobody_adj( self.n, EI, EJ, self.h) if (task == 'diagnosis_number'): adj_nor_oper, adj_nor_idx = triple_commutator_adj_onebody_nor( self.n, EI, EJ, self.ne) adj_adj_oper, adj_adj_idx = triple_commutator_adj_onebody_adj( self.n, EI, EJ, self.ne) if (task == 'diagnosis_spin-z'): adj_nor_oper, adj_nor_idx = triple_commutator_adj_onebody_nor( self.n, EI, EJ, self.sz) adj_adj_oper, adj_adj_idx = triple_commutator_adj_onebody_adj( self.n, EI, EJ, self.sz) if (task == 'diagnosis_spin-squared'): adj_nor_oper, adj_nor_idx = triple_commutator_adj_twobody_nor( self.n, EI, EJ, self.ss) adj_adj_oper, adj_adj_idx = triple_commutator_adj_twobody_adj( self.n, EI, EJ, self.ss) t1 = time.time() self.logfile.write( "task: " + task + " elements %d %d --- time for FermionicOperator %f\n" % (I, J, t1 - t0)) # ----- mapping adj_nor_oper = adj_nor_oper.mapping(map_type=qubit_mapping.value, threshold=epsilon, idx=adj_nor_idx) adj_adj_oper = adj_adj_oper.mapping(map_type=qubit_mapping.value, threshold=epsilon, idx=adj_adj_idx) if qubit_mapping.value == 'parity' and two_qubit_reduction: adj_nor_oper = Z2Symmetries.two_qubit_reduction( adj_nor_oper, num_particles) adj_adj_oper = Z2Symmetries.two_qubit_reduction( adj_adj_oper, num_particles) self.matrix_elements_adj_nor[task].append(adj_nor_oper) self.matrix_elements_adj_adj[task].append(adj_adj_oper) t2 = time.time() # ----- timings self.logfile.write("task: " + task + " elements %d %d --- time for Mapping %f\n" % (I, J, t2 - t1)) self.time_statistics[task].append((I, J, t1 - t0, t2 - t1))
def build_overlap_operators(self, qubit_mapping, two_qubit_reduction, epsilon, num_particles): self.V_elements = [] self.W_elements = [] self.times_VW = [] for (I, J) in self.elements: t0 = time.time() EI, EJ = self.E_mu[I], self.E_mu[J] VIJ_oper, VIJ_idx = commutator_adj_nor(self.n, EI, EJ) WIJ_oper, WIJ_idx = [None] * 4, [None] * 4 t1 = time.time() self.logfile.write( "V,W elements %d %d --- time for FermionicOperator %f\n" % (I, J, t1 - t0)) VIJ_oper = VIJ_oper.mapping(map_type=qubit_mapping.value, threshold=epsilon, idx=VIJ_idx) if qubit_mapping.value == 'parity' and two_qubit_reduction: VIJ_oper = Z2Symmetries.two_qubit_reduction( VIJ_oper, num_particles) self.V_elements.append(VIJ_oper) t2 = time.time() self.times_VW.append((I, J, t1 - t0, t2 - t1)) self.logfile.write("V,W elements %d %d --- time for Mapping %f\n" % (I, J, t2 - t1))
def get_qubit_op(target_molecule): geometry, multiplicity, charge = generate_molecule_dict() driver = PySCFDriver(atom=geometry_convert(target_molecule), unit=UnitsType.ANGSTROM, charge=charge[target_molecule], spin=0, basis='sto3g') molecule = driver.run() repulsion_energy = molecule.nuclear_repulsion_energy num_particles = molecule.num_alpha + molecule.num_beta num_spin_orbitals = molecule.num_orbitals * 2 one_RDM = make_one_rdm(target_molecule) w = calculate_noons(one_RDM) freeze_list, remove_list = generate_freeze_remove_list(w) remove_list = [x % molecule.num_orbitals for x in remove_list] freeze_list = [x % molecule.num_orbitals for x in freeze_list] remove_list = [x - len(freeze_list) for x in remove_list] remove_list += [ x + molecule.num_orbitals - len(freeze_list) for x in remove_list ] freeze_list += [x + molecule.num_orbitals for x in freeze_list] ferOp = FermionicOperator(h1=molecule.one_body_integrals, h2=molecule.two_body_integrals) ferOp, energy_shift = ferOp.fermion_mode_freezing(freeze_list) num_spin_orbitals -= len(freeze_list) num_particles -= len(freeze_list) ferOp = ferOp.fermion_mode_elimination(remove_list) num_spin_orbitals -= len(remove_list) qubitOp = ferOp.mapping(map_type='bravyi_kitaev', threshold=0.00000001) qubitOp = Z2Symmetries.two_qubit_reduction(qubitOp, num_particles) shift = energy_shift + repulsion_energy return qubitOp, num_particles, num_spin_orbitals, shift
def load_qubitop_for_molecule(molecule_data): atom_list = [a[0] + ' ' + " ".join([str(elem) for elem in a[1]]) for a in molecule_data['geometry']] atom = "; ".join(atom_list) #atom = 'Li .0 .0 .0; H .0 .0 3.9' basis = molecule_data['basis'] transform = molecule_data['transform'] electrons = molecule_data['electrons'] active = molecule_data['active_orbitals'] driver = PySCFDriver(atom=atom, unit=UnitsType.ANGSTROM, basis=basis, charge=0, spin=0) molecule = driver.run() num_particles = molecule.num_alpha + molecule.num_beta num_spin_orbitals = molecule.num_orbitals * 2 #print("# of electrons: {}".format(num_particles)) #print("# of spin orbitals: {}".format(num_spin_orbitals)) freeze_list = [x for x in range(int(active/2), int(num_particles/2))] remove_list = [-x for x in range(active,molecule.num_orbitals-int(num_particles/2)+int(active/2))] #print(freeze_list) #print(remove_list) if transform == 'BK': map_type = 'bravyi_kitaev' elif transform == 'JW': map_type = 'jordan_wigner' else: map_type = 'parity' remove_list = [x % molecule.num_orbitals for x in remove_list] freeze_list = [x % molecule.num_orbitals for x in freeze_list] remove_list = [x - len(freeze_list) for x in remove_list] remove_list += [x + molecule.num_orbitals - len(freeze_list) for x in remove_list] freeze_list += [x + molecule.num_orbitals for x in freeze_list] fermiOp = FermionicOperator(h1=molecule.one_body_integrals, h2=molecule.two_body_integrals) energy_shift = 0 if len(freeze_list) > 0: fermiOp, energy_shift = fermiOp.fermion_mode_freezing(freeze_list) num_spin_orbitals -= len(freeze_list) num_particles -= len(freeze_list) if len(remove_list) > 0: fermiOp = fermiOp.fermion_mode_elimination(remove_list) num_spin_orbitals -= len(remove_list) qubitOp = fermiOp.mapping(map_type=map_type, threshold=0.00000001) if len(freeze_list) > 0 or len(remove_list) >0: qubitOp = Z2Symmetries.two_qubit_reduction(qubitOp, num_particles) #print(qubitOp.print_operators()) num_spin_orbitals= qubitOp.num_qubits return molecule, qubitOp, map_type, num_particles, num_spin_orbitals