Skip to content

Instantly share code, notes, and snippets.

@Anthony-Gandon
Created December 8, 2022 05:45
Show Gist options
  • Save Anthony-Gandon/96285641fc2520ddf411d9f466ea7b7e to your computer and use it in GitHub Desktop.
Save Anthony-Gandon/96285641fc2520ddf411d9f466ea7b7e to your computer and use it in GitHub Desktop.
QubitConverter_QubitMapper
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"import numpy as np\n",
"\n",
"from qiskit.algorithms.minimum_eigensolvers import VQE\n",
"from qiskit.algorithms.optimizers import SLSQP, SPSA\n",
"from qiskit.primitives import Estimator\n",
"\n",
"from qiskit_nature.second_q.algorithms import (GroundStateEigensolver, VQEUCCFactory)\n",
"from qiskit_nature.second_q.circuit.library import HartreeFock, UCC, UCCSD\n",
"from qiskit_nature.second_q.drivers import PySCFDriver\n",
"from qiskit_nature.second_q.mappers import JordanWignerMapper, ParityMapper\n",
"from qiskit_nature.second_q.mappers import QubitConverter\n",
"from qiskit_nature.second_q.hamiltonians import ElectronicEnergy\n",
"from qiskit_nature.second_q.algorithms import NumPyEigensolverFactory, ExcitedStatesEigensolver\n",
"\n",
"from qiskit.algorithms.minimum_eigensolvers import NumPyMinimumEigensolver\n",
"from qiskit.algorithms.eigensolvers import NumPyEigensolver\n",
"\n",
"from qiskit_nature.second_q.circuit.library import HartreeFock\n",
"from qiskit import QuantumCircuit\n",
"\n",
"from qiskit_nature.second_q.algorithms import QEOM\n",
"\n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# 1) Test GroundtateEigensolver"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Main: QC\n",
"Auxop: QC\n",
"Main: MP\n",
"Auxop: MP\n",
"[-1.85727503]\n",
"[-1.85727503]\n",
"[{'AngularMomentum': 0.0, 'Magnetization': 0.0, 'ParticleNumber': 1.9999999999999893, 'XDipole': 0.0, 'YDipole': 0.0, 'ZDipole': 1.3889487015553121, 'test_op': -1.8572750301445862}]\n",
"[{'AngularMomentum': 0.0, 'Magnetization': 0.0, 'ParticleNumber': 1.9999999999999893, 'XDipole': 0.0, 'YDipole': 0.0, 'ZDipole': 1.3889487015553121, 'test_op': -1.8572750301445862}]\n",
"Main: QC\n",
"Auxop: QC\n",
"Main: MP\n",
"Auxop: MP\n",
"[-1.85727503]\n",
"[-1.85727503]\n",
"[{'AngularMomentum': 0.0, 'Magnetization': 0.0, 'ParticleNumber': 1.9999999999999991, 'XDipole': 0.0, 'YDipole': 0.0, 'test_op': -1.8572750301447267}]\n",
"[{'AngularMomentum': 0.0, 'Magnetization': 0.0, 'ParticleNumber': 1.9999999999999893, 'XDipole': 0.0, 'YDipole': 0.0, 'ZDipole': 1.3889487015553121, 'test_op': -1.8572750301445862}]\n"
]
}
],
"source": [
"def test_groundstate_eigensolver():\n",
" driver = PySCFDriver()\n",
"\n",
" reference_energy = -1.1373060356951838\n",
"\n",
" mapper = JordanWignerMapper()\n",
" qubit_converter = QubitConverter(mapper)\n",
" electronic_structure_problem = driver.run()\n",
" hamiltonian, second_q_ops = electronic_structure_problem.second_q_ops()\n",
" aux_op = {'test_op': hamiltonian}\n",
" num_spatial_orbitals = 2\n",
" num_particles = (1, 1)\n",
"\n",
" solver_qc = VQEUCCFactory(Estimator(), UCC(excitations=\"d\"), SLSQP())\n",
" calc_qc = GroundStateEigensolver(qubit_converter, solver_qc)\n",
" res_qc = calc_qc.solve(electronic_structure_problem, aux_operators=aux_op)\n",
" \n",
" solver_mp = VQEUCCFactory(Estimator(), UCC(excitations=\"d\"), SLSQP())\n",
" calc_mp = GroundStateEigensolver(mapper, solver_mp)\n",
" res_mp = calc_mp.solve(electronic_structure_problem, aux_operators=aux_op)\n",
" \n",
" print(res_qc.computed_energies)\n",
" print(res_mp.computed_energies)\n",
" \n",
" print(res_qc.aux_operators_evaluated)\n",
" print(res_mp.aux_operators_evaluated)\n",
"\n",
"def test_groundstate_eigensolver_z2sym():\n",
" driver = PySCFDriver()\n",
"\n",
" reference_energy = -1.1373060356951838\n",
"\n",
" mapper = JordanWignerMapper()\n",
" qubit_converter = QubitConverter(mapper, z2symmetry_reduction=\"auto\", two_qubit_reduction=True)\n",
" electronic_structure_problem = driver.run()\n",
" hamiltonian, second_q_ops = electronic_structure_problem.second_q_ops()\n",
" aux_op = {'test_op': hamiltonian}\n",
" num_spatial_orbitals = 2\n",
" num_particles = (1, 1)\n",
"\n",
" solver_qc = VQEUCCFactory(Estimator(), UCC(excitations=\"d\"), SLSQP())\n",
" calc_qc = GroundStateEigensolver(qubit_converter, solver_qc)\n",
" res_qc = calc_qc.solve(electronic_structure_problem, aux_operators=aux_op)\n",
" \n",
" solver_mp = VQEUCCFactory(Estimator(), UCC(excitations=\"d\"), SLSQP())\n",
" calc_mp = GroundStateEigensolver(mapper, solver_mp)\n",
" res_mp = calc_mp.solve(electronic_structure_problem, aux_operators=aux_op)\n",
" \n",
" print(res_qc.computed_energies)\n",
" print(res_mp.computed_energies)\n",
" \n",
" print(res_qc.aux_operators_evaluated)\n",
" print(res_mp.aux_operators_evaluated)\n",
"\n",
"\n",
"test_groundstate_eigensolver()\n",
"test_groundstate_eigensolver_z2sym()\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# 2) Test ExcitedStatesSolver"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Main: QC\n",
"Auxop: QC\n",
"Main: MP\n",
"Auxop: MP\n",
"[-1.85727503 -0.88272215 -0.22491125]\n",
"[-1.85727503 -0.88272215 -0.22491125]\n",
"[{'AngularMomentum': 0.0, 'Magnetization': 0.0, 'ParticleNumber': (1.9999999999999998+0j), 'XDipole': 0.0, 'YDipole': 0.0, 'ZDipole': (1.3889487015553197+0j), 'test_op': (-1.8572750302023793+0j)}, {'AngularMomentum': 0.0, 'Magnetization': 0.0, 'ParticleNumber': (1.9999999999999996+0j), 'XDipole': 0.0, 'YDipole': 0.0, 'ZDipole': (1.3889487015553201+0j), 'test_op': (-0.8827221502448648+0j)}, {'AngularMomentum': 0.0, 'Magnetization': 0.0, 'ParticleNumber': (1.9999999999999998+0j), 'XDipole': 0.0, 'YDipole': 0.0, 'ZDipole': (1.3889487015553206+0j), 'test_op': (-0.22491125283087152+0j)}]\n",
"[{'AngularMomentum': 0.0, 'Magnetization': 0.0, 'ParticleNumber': (1.9999999999999998+0j), 'XDipole': 0.0, 'YDipole': 0.0, 'ZDipole': (1.3889487015553197+0j), 'test_op': (-1.8572750302023793+0j)}, {'AngularMomentum': 0.0, 'Magnetization': 0.0, 'ParticleNumber': (1.9999999999999996+0j), 'XDipole': 0.0, 'YDipole': 0.0, 'ZDipole': (1.3889487015553201+0j), 'test_op': (-0.8827221502448648+0j)}, {'AngularMomentum': 0.0, 'Magnetization': 0.0, 'ParticleNumber': (1.9999999999999998+0j), 'XDipole': 0.0, 'YDipole': 0.0, 'ZDipole': (1.3889487015553206+0j), 'test_op': (-0.22491125283087152+0j)}]\n",
"Main: QC\n",
"Auxop: QC\n",
"Main: MP\n",
"Auxop: MP\n",
"[-1.85727503 -0.22491125]\n",
"[-1.85727503e+00 -1.25633907e+00 -1.25633907e+00 -1.24458455e+00\n",
" -1.24458455e+00 -1.24458455e+00 -1.16063174e+00 -1.16063174e+00\n",
" -8.82722150e-01 -4.71896007e-01 -4.71896007e-01 -3.53325104e-01\n",
" -3.53325104e-01 -2.24911253e-01 -3.88578059e-16 2.14278238e-01]\n",
"[{'AngularMomentum': 0.0, 'Magnetization': 0.0, 'ParticleNumber': (1.999999999999999+0j), 'XDipole': 0.0, 'YDipole': 0.0, 'test_op': (-1.8572750302023784+0j)}, {'AngularMomentum': 0.0, 'Magnetization': 0.0, 'ParticleNumber': (1.999999999999999+0j), 'XDipole': 0.0, 'YDipole': 0.0, 'test_op': (-0.22491125283087143+0j)}]\n",
"[{'AngularMomentum': 0.0, 'Magnetization': 0.0, 'ParticleNumber': (1.9999999999999998+0j), 'XDipole': 0.0, 'YDipole': 0.0, 'ZDipole': (1.3889487015553197+0j), 'test_op': (-1.8572750302023793+0j)}, {'AngularMomentum': (0.75+0j), 'Magnetization': (0.5+0j), 'ParticleNumber': (1+0j), 'XDipole': 0.0, 'YDipole': 0.0, 'ZDipole': (0.6944743507776601+0j), 'test_op': (-1.2563390730032502+0j)}, {'AngularMomentum': (0.75+0j), 'Magnetization': (-0.5+0j), 'ParticleNumber': (1+0j), 'XDipole': 0.0, 'YDipole': 0.0, 'ZDipole': (0.6944743507776601+0j), 'test_op': (-1.2563390730032502+0j)}, {'AngularMomentum': (1.9999999999999996+0j), 'Magnetization': 0.0, 'ParticleNumber': (1.9999999999999996+0j), 'XDipole': 0.0, 'YDipole': 0.0, 'ZDipole': (1.3889487015553201+0j), 'test_op': (-1.2445845498133274+0j)}, {'AngularMomentum': (2+0j), 'Magnetization': (1+0j), 'ParticleNumber': (2+0j), 'XDipole': 0.0, 'YDipole': 0.0, 'ZDipole': (1.3889487015553204+0j), 'test_op': (-1.2445845498133274+0j)}, {'AngularMomentum': (2+0j), 'Magnetization': (-1+0j), 'ParticleNumber': (2+0j), 'XDipole': 0.0, 'YDipole': 0.0, 'ZDipole': (1.3889487015553204+0j), 'test_op': (-1.2445845498133274+0j)}, {'AngularMomentum': (0.75+0j), 'Magnetization': (0.5+0j), 'ParticleNumber': (3+0j), 'XDipole': 0.0, 'YDipole': 0.0, 'ZDipole': (2.08342305233298+0j), 'test_op': (-1.1606317377577646+0j)}, {'AngularMomentum': (0.75+0j), 'Magnetization': (-0.5+0j), 'ParticleNumber': (3+0j), 'XDipole': 0.0, 'YDipole': 0.0, 'ZDipole': (2.0834230523329804+0j), 'test_op': (-1.1606317377577646+0j)}, {'AngularMomentum': 0.0, 'Magnetization': 0.0, 'ParticleNumber': (1.9999999999999996+0j), 'XDipole': 0.0, 'YDipole': 0.0, 'ZDipole': (1.3889487015553201+0j), 'test_op': (-0.8827221502448648+0j)}, {'AngularMomentum': (0.75+0j), 'Magnetization': (0.5+0j), 'ParticleNumber': (1+0j), 'XDipole': 0.0, 'YDipole': 0.0, 'ZDipole': (0.6944743507776605+0j), 'test_op': (-0.4718960072811429+0j)}, {'AngularMomentum': (0.75+0j), 'Magnetization': (-0.5+0j), 'ParticleNumber': (1+0j), 'XDipole': 0.0, 'YDipole': 0.0, 'ZDipole': (0.6944743507776605+0j), 'test_op': (-0.4718960072811429+0j)}, {'AngularMomentum': (0.75+0j), 'Magnetization': (0.5+0j), 'ParticleNumber': (3+0j), 'XDipole': 0.0, 'YDipole': 0.0, 'ZDipole': (2.083423052332981+0j), 'test_op': (-0.3533251041071557+0j)}, {'AngularMomentum': (0.75+0j), 'Magnetization': (-0.5+0j), 'ParticleNumber': (3+0j), 'XDipole': 0.0, 'YDipole': 0.0, 'ZDipole': (2.083423052332981+0j), 'test_op': (-0.3533251041071557+0j)}, {'AngularMomentum': 0.0, 'Magnetization': 0.0, 'ParticleNumber': (1.9999999999999998+0j), 'XDipole': 0.0, 'YDipole': 0.0, 'ZDipole': (1.3889487015553206+0j), 'test_op': (-0.22491125283087152+0j)}, {'AngularMomentum': 0.0, 'Magnetization': 0.0, 'ParticleNumber': 0.0, 'XDipole': 0.0, 'YDipole': 0.0, 'ZDipole': 0.0, 'test_op': 0.0}, {'AngularMomentum': 0.0, 'Magnetization': 0.0, 'ParticleNumber': (4+0j), 'XDipole': 0.0, 'YDipole': 0.0, 'ZDipole': (2.7778974031106407+0j), 'test_op': (0.21427823841947244+0j)}]\n"
]
}
],
"source": [
"def filter_criterion(eigenstate, eigenvalue, aux_values):\n",
" return np.isclose(aux_values[\"ParticleNumber\"][0], 2.0) and np.isclose(aux_values[\"AngularMomentum\"][0], 0.0)\n",
"\n",
"\n",
"def test_excitedstates_eigensolver():\n",
" driver = PySCFDriver()\n",
"\n",
" reference_energy = -1.1373060356951838\n",
"\n",
" mapper = JordanWignerMapper()\n",
" qubit_converter = QubitConverter(mapper)\n",
" electronic_structure_problem = driver.run()\n",
" hamiltonian, second_q_ops = electronic_structure_problem.second_q_ops()\n",
" aux_op = {'test_op': hamiltonian}\n",
" num_spatial_orbitals = 2\n",
" num_particles = (1, 1)\n",
"\n",
" solver_qc = NumPyEigensolverFactory(filter_criterion=filter_criterion)\n",
" calc_qc = ExcitedStatesEigensolver(qubit_converter, solver_qc)\n",
" res_qc = calc_qc.solve(electronic_structure_problem, aux_operators=aux_op)\n",
" \n",
" solver_mp = NumPyEigensolverFactory(filter_criterion=filter_criterion)\n",
" calc_mp = ExcitedStatesEigensolver(mapper, solver_mp)\n",
" res_mp = calc_mp.solve(electronic_structure_problem, aux_operators=aux_op)\n",
" \n",
" print(res_qc.computed_energies)\n",
" print(res_mp.computed_energies)\n",
" \n",
" print(res_qc.aux_operators_evaluated)\n",
" print(res_mp.aux_operators_evaluated)\n",
"\n",
"def test_excitedstates_eigensolver_z2sym():\n",
" driver = PySCFDriver()\n",
"\n",
" reference_energy = -1.1373060356951838\n",
"\n",
" mapper = JordanWignerMapper()\n",
" qubit_converter = QubitConverter(mapper, z2symmetry_reduction=\"auto\", two_qubit_reduction=True)\n",
" electronic_structure_problem = driver.run()\n",
" hamiltonian, second_q_ops = electronic_structure_problem.second_q_ops()\n",
" aux_op = {'test_op': hamiltonian}\n",
" num_spatial_orbitals = 2\n",
" num_particles = (1, 1)\n",
" \n",
" solver_qc = NumPyEigensolverFactory()\n",
" calc_qc = ExcitedStatesEigensolver(qubit_converter, solver_qc)\n",
" res_qc = calc_qc.solve(electronic_structure_problem, aux_operators=aux_op)\n",
" \n",
" solver_mp = NumPyEigensolverFactory()\n",
" calc_mp = ExcitedStatesEigensolver(mapper, solver_mp)\n",
" res_mp = calc_mp.solve(electronic_structure_problem, aux_operators=aux_op)\n",
" \n",
" print(res_qc.computed_energies)\n",
" print(res_mp.computed_energies)\n",
" \n",
" print(res_qc.aux_operators_evaluated)\n",
" print(res_mp.aux_operators_evaluated)\n",
"\n",
"\n",
"test_excitedstates_eigensolver()\n",
"test_excitedstates_eigensolver_z2sym()\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# 3) Test QEOM vibrational_ops builder"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# 4) Test Ansatzes"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"True\n"
]
}
],
"source": [
"def test_ucc_ansatz():\n",
" mapper = JordanWignerMapper()\n",
" converter = QubitConverter(mapper)\n",
" \n",
" ansatz_qc = UCC(\n",
" qubit_converter=converter,\n",
" num_particles=(2, 2),\n",
" num_spatial_orbitals=4,\n",
" excitations=\"t\",\n",
" )\n",
" \n",
" ansatz_mp = UCC(\n",
" qubit_converter=mapper,\n",
" num_particles=(2, 2),\n",
" num_spatial_orbitals=4,\n",
" excitations=\"t\",\n",
" )\n",
" \n",
" print(ansatz_qc.operators == ansatz_mp.operators)\n",
" \n",
"test_ucc_ansatz()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# 5) Test Hartee Fock"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
" ┌───┐\n",
"q_0: ┤ X ├\n",
" └───┘\n",
"q_1: ─────\n",
" ┌───┐\n",
"q_2: ┤ X ├\n",
" └───┘\n",
"q_3: ─────\n",
" \n",
" ┌───┐\n",
"q_0: ┤ X ├\n",
" └───┘\n",
"q_1: ─────\n",
" ┌───┐\n",
"q_2: ┤ X ├\n",
" └───┘\n",
"q_3: ─────\n",
" \n"
]
}
],
"source": [
"def test_HF():\n",
" state_qc = HartreeFock(2, (1, 1), QubitConverter(JordanWignerMapper()))\n",
" state_mp = HartreeFock(2, (1, 1), JordanWignerMapper())\n",
" \n",
" print(state_qc)\n",
" print(state_mp)\n",
" \n",
"test_HF()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# 6) Test QEOM"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"With qEOM the auxiliary operators can currently only be evaluated on the ground state.\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Main: QC\n",
"Auxop: QC\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"With qEOM the auxiliary operators can currently only be evaluated on the ground state.\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Main: MP\n",
"Auxop: MP\n",
"[-1.85727503 -1.24458675 -0.88272435 -0.22491345]\n",
"[-1.85727503 -1.24458675 -0.88272435 -0.22491345]\n",
"[{'AngularMomentum': 0.0, 'Magnetization': 0.0, 'ParticleNumber': 1.999999999999985, 'XDipole': 0.0, 'YDipole': 0.0, 'ZDipole': 1.3889489297269892, 'test_op': -1.8572750301449046}]\n",
"[{'AngularMomentum': 0.0, 'Magnetization': 0.0, 'ParticleNumber': 1.999999999999985, 'XDipole': 0.0, 'YDipole': 0.0, 'ZDipole': 1.3889489297269892, 'test_op': -1.8572750301449046}]\n"
]
}
],
"source": [
"def test_qeom():\n",
" mapper = JordanWignerMapper()\n",
" converter = QubitConverter(mapper)\n",
" driver = PySCFDriver()\n",
" esp = driver.run()\n",
" hamiltonian, second_q_ops = esp.second_q_ops()\n",
" aux_op = {'test_op': hamiltonian}\n",
" \n",
" estimator = Estimator()\n",
" solver = VQEUCCFactory(estimator, UCCSD(), SLSQP())\n",
" \n",
" gsc_qc = GroundStateEigensolver(converter, solver)\n",
" esc_qc = QEOM(gsc_qc, estimator, \"sd\")\n",
" results_qc = esc_qc.solve(esp, aux_operators = aux_op)\n",
" \n",
" gsc_mp = GroundStateEigensolver(mapper, solver)\n",
" esc_mp = QEOM(gsc_mp, estimator, \"sd\")\n",
" results_mp = esc_mp.solve(esp, aux_operators = aux_op)\n",
" \n",
" print(results_qc.computed_energies)\n",
" print(results_mp.computed_energies)\n",
" \n",
" print(results_qc.aux_operators_evaluated)\n",
" print(results_mp.aux_operators_evaluated)\n",
"\n",
" \n",
"test_qeom()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3.9.6 ('qiskit_38_git')",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.9.6"
},
"orig_nbformat": 4,
"vscode": {
"interpreter": {
"hash": "c23d0bc06ef4418175036bf679a995f216aae1ef50c693f851eb63af89d8be8d"
}
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment