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