Lattice Model Problems with v0.5

The lattice models have only received some minor updates in this release of Qiskit Nature.

One important change is that since all lattice models now implement the new Hamiltonian interface rather than the old Property one, you obtain the actual operator via the second_q_op() method instead of second_q_ops() (Note the trailing s).

Overview

Most notably, the imports have changed as follows:

Legacy location

New location

qiskit_nature.problems.second_quantization.lattice.models

qiskit_nature.second_q.hamiltonians

qiskit_nature.problems.second_quantization.lattice.lattices

qiskit_nature.second_q.hamiltonians.lattices

qiskit_nature.problems.second_quantization.lattice.LatticeModelProblem

qiskit_nature.second_q.problems.LatticeModelProblem

Furthermore, the factory methods for Lattice objects defined on the LatticeModel classes were migrated as follows:

Legacy method

New method

FermiHubbardModel.uniform_parameters

Lattice.uniform_parameters

FermiHubbardModel.from_parameters

Lattice.from_adjacency_matrix

IsingModel.uniform_parameters

Lattice.uniform_parameters

IsingModel.from_parameters

Lattice.from_adjacency_matrix

Further Resources

Be sure to check out the following tutorials for how to use the new code:

FermiHubbardModel.uniform_parameters

Previously

from qiskit_nature.problems.second_quantization.lattice.lattices import LineLattice
from qiskit_nature.problems.second_quantization.lattice.models import FermiHubbardModel

line = LineLattice(2)
fermi = FermiHubbardModel.uniform_parameters(line, 2.0, 4.0, 3.0)
print(fermi.second_q_ops())  # Note: the trailing `s`
Fermionic Operator
register length=4, number terms=10
  (2+0j) * ( +_0 -_2 )
+ (-2+0j) * ( -_0 +_2 )
+ (4+0j) * ( +_0 -_0 )
+ (4+0j) * ( +_2 -_2 )
+ (2+0j) * ( +_1 -_3 )
+ (-2+0j) * ( -_1 +_3 )
+ (4+0j) * ( +_1 -_1 )
+ (4+0j) * ( +_3 -_3 )
+ (3+0j) * ...

New

from qiskit_nature.second_q.hamiltonians.lattices import LineLattice
from qiskit_nature.second_q.hamiltonians import FermiHubbardModel

line = LineLattice(2)
fermi = FermiHubbardModel(line.uniform_parameters(2.0, 4.0), 3.0)
print(fermi.second_q_op())  # Note: NO trailing `s`
Fermionic Operator
number spin orbitals=4, number terms=10
  2.0 * ( +_0 -_2 )
+ -2.0 * ( -_0 +_2 )
+ 4.0 * ( +_0 -_0 )
+ 4.0 * ( +_2 -_2 )
+ 2.0 * ( +_1 -_3 )
+ -2.0 * ( -_1 +_3 )
+ 4.0 * ( +_1 -_1 )
+ 4.0 * ( +_3 -_3 )
+ 3.0 * ( +_0 -_0 +_1 -_1 )
+ 3.0 * ( +_2 -_2 +_3 -_3 )

FermiHubbardModel.from_parameters

Previously

import numpy as np
from qiskit_nature.problems.second_quantization.lattice.models import FermiHubbardModel

interaction = np.array([[4.0, 2.0], [2.0, 4.0]])

fermi = FermiHubbardModel.from_parameters(interaction, 3.0)
print(fermi.second_q_ops())  # Note: the trailing `s`
Fermionic Operator
register length=4, number terms=10
  (4+0j) * ( +_0 -_0 )
+ (2+0j) * ( +_0 -_2 )
+ (-2+0j) * ( -_0 +_2 )
+ (4+0j) * ( +_2 -_2 )
+ (4+0j) * ( +_1 -_1 )
+ (2+0j) * ( +_1 -_3 )
+ (-2+0j) * ( -_1 +_3 )
+ (4+0j) * ( +_3 -_3 )
+ (3+0j) * ...

New

import numpy as np
from qiskit_nature.second_q.hamiltonians.lattices import Lattice
from qiskit_nature.second_q.hamiltonians import FermiHubbardModel

interaction = np.array([[4.0, 2.0], [2.0, 4.0]])

lattice = Lattice.from_adjacency_matrix(interaction)
fermi = FermiHubbardModel(lattice, 3.0)
print(fermi.second_q_op())  # Note: NO trailing `s`
Fermionic Operator
number spin orbitals=4, number terms=10
  4.0 * ( +_0 -_0 )
+ 2.0 * ( +_0 -_2 )
+ -2.0 * ( -_0 +_2 )
+ 4.0 * ( +_2 -_2 )
+ 4.0 * ( +_1 -_1 )
+ 2.0 * ( +_1 -_3 )
+ -2.0 * ( -_1 +_3 )
+ 4.0 * ( +_3 -_3 )
+ 3.0 * ( +_0 -_0 +_1 -_1 )
+ 3.0 * ( +_2 -_2 +_3 -_3 )

IsingModel.uniform_parameters

Previously

from qiskit_nature.problems.second_quantization.lattice.lattices import LineLattice
from qiskit_nature.problems.second_quantization.lattice.models import IsingModel

line = LineLattice(2)
ising = IsingModel.uniform_parameters(line, 2.0, 4.0)
print(ising.second_q_ops())  # Note: the trailing `s`
  Z_0 Z_1 * (2+0j)
+ X_0 * (4+0j)
+ X_1 * (4+0j)

New

from qiskit_nature.second_q.hamiltonians.lattices import LineLattice
from qiskit_nature.second_q.hamiltonians import IsingModel

line = LineLattice(2)
ising = IsingModel(line.uniform_parameters(2.0, 4.0))
print(ising.second_q_op())  # Note: NO trailing `s`
Spin Operator
spin=1/2, number spins=2, number terms=3
  2.0 * ( Z_0 Z_1 )
+ 4.0 * ( X_0 )
+ 4.0 * ( X_1 )

IsingModel.from_parameters

Previously

import numpy as np
from qiskit_nature.problems.second_quantization.lattice.models import IsingModel

interaction = np.array([[4.0, 2.0], [2.0, 4.0]])

ising = IsingModel.from_parameters(interaction)
print(ising.second_q_ops())  # Note: the trailing `s`
  X_0 * (4+0j)
+ Z_0 Z_1 * (2+0j)
+ X_1 * (4+0j)

New

import numpy as np
from qiskit_nature.second_q.hamiltonians.lattices import Lattice
from qiskit_nature.second_q.hamiltonians import IsingModel

interaction = np.array([[4.0, 2.0], [2.0, 4.0]])

lattice = Lattice.from_adjacency_matrix(interaction)
ising = IsingModel(lattice)
print(ising.second_q_op())  # Note: NO trailing `s`
Spin Operator
spin=1/2, number spins=2, number terms=3
  4.0 * ( X_0 )
+ 2.0 * ( Z_0 Z_1 )
+ 4.0 * ( X_1 )