Source code for qlauncher.problems.problem_initialization.molecule

 1from qiskit.quantum_info import SparsePauliOp
 2
 3from qiskit_nature.second_q.formats.molecule_info import MoleculeInfo
 4from qiskit_nature.second_q.drivers import PySCFDriver
 5from qiskit_nature.second_q.mappers import ParityMapper, QubitMapper
 6from qiskit_nature.second_q.problems import ElectronicStructureProblem
 7
 8from qlauncher.base import Problem
 9
10
[docs] 11class Molecule(Problem): 12 def __init__(self, instance: MoleculeInfo, mapper: QubitMapper | None = None, basis_set: str = 'STO-6G', instance_name: str = 'unnamed') -> None: 13 self.basis_set = basis_set 14 self.mapper = ParityMapper() if mapper is None else mapper 15 self.problem: ElectronicStructureProblem = self._get_problem(instance) 16 self.operator: SparsePauliOp = self._get_operator(self.problem) 17 super().__init__(instance, instance_name) 18
[docs] 19 @staticmethod 20 def from_preset(instance_name: str) -> "Molecule": 21 match instance_name: 22 case 'H2': 23 instance = MoleculeInfo(["H", "H"], [(0.0, 0.0, 0.0), (0.0, 0.0, 0.74)]) 24 case _: 25 raise ValueError(f"Molecule {instance_name} not supported, currently you can use: 'H2'") 26 return Molecule(instance, instance_name=instance_name)
27 28 def _get_problem(self, molecule) -> ElectronicStructureProblem: 29 driver = PySCFDriver.from_molecule(molecule, basis=self.basis_set) 30 problem = driver.run() 31 return problem 32 33 def _get_operator(self, problem) -> SparsePauliOp: 34 self.mapper.num_particles = problem.num_particles 35 hamiltonian = self.mapper.map(problem.hamiltonian.second_q_op()) 36 if not isinstance(hamiltonian, SparsePauliOp): 37 raise ValueError 38 return hamiltonian