Fermionic Hamiltonians#
Class and methods to easily build general Fermion Hamiltonians.
- class ferrmion.hamiltonians.FermionHamiltonian(*, terms: dict[str, ndarray[tuple[int, ...], dtype[_ScalarType_co]]] = {}, constant_energy: float = 0.0)[source]#
Bases:
objectClass for building Fermionic Hamiltonians.
- add_constant(constant_energy: float) FermionHamiltonian[source]#
Add a constant term to the Hamiltonian.
- annihilation() FermionHamiltonian[source]#
Add an annihilation term.
- creation() FermionHamiltonian[source]#
Add a creation term.
- property signatures_and_coefficients: tuple[list[str], list[ndarray[tuple[int, ...], dtype[_ScalarType_co]]]]#
Return the signature and coefficient of all terms.
- with_coefficients(coefficients: ndarray[tuple[int, ...], dtype[_ScalarType_co]]) FermionHamiltonian[source]#
Add coefficients to the Hamiltonian terms.
- class ferrmion.hamiltonians.QubitHamiltonian[source]#
Bases:
dict[str,complex]Mapping from Pauli strings to complex coefficients.
Subclasses
dictso all standard mapping operations (q[key],q.items(),len(q),q.get(...)) work as expected, and adds Clifford-based optimisation methods that return a newQubitHamiltonian.- clifford_heuristic(temperature: float | None = None, coefficient_weighted: bool = False, seed: int | None = None, clifford_subset: str = 'chs') QubitHamiltonian[source]#
Optimise this Hamiltonian via Clifford-heuristic simulated annealing.
- Parameters:
temperature – Initial annealing temperature. Defaults to
2 * n_qubits.coefficient_weighted – If
True, minimise coefficient-weighted Pauli weight.seed – Seed for the RNG. Defaults to
1017when omitted.clifford_subset – Gate families to sample from. One of
"all","c","ch","cs","chs"(default), or"vp"(vacuum-preserving: uniform pick between a singleSor a singleCNOT, which together stabilise the|0…0⟩vacuum of any ternary-tree-derived encoding).
- Returns:
The optimised Hamiltonian.
- Return type:
- property n_qubits: int#
Number of qubits, inferred from the length of any Pauli key.
- randomised_subsystem_descent(iterations: int, subsystem_dimension: int, temperature: float | None = None, coefficient_weighted: bool = False, sampler: str = 'hamming', seed: int | None = None, clifford_subset: str = 'chs') QubitHamiltonian[source]#
Iteratively optimise this Hamiltonian via Clifford-heuristic simulated annealing.
- Parameters:
iterations – Number of subsystem-local Clifford descents to perform.
subsystem_dimension – Number of qubits in each sampled subsystem.
temperature – Annealing temperature for each descent. Defaults to
2 * n_qubits.coefficient_weighted – If
True, minimise coefficient-weighted Pauli weight.sampler – Subsystem sampling strategy:
"full_system","uniform", or"hamming".seed – Seed for the RNG. Defaults to
1017when omitted.clifford_subset – Gate families to sample from. One of
"all","c","ch","cs","chs"(default), or"vp"(vacuum-preserving: uniform pick between a singleSor a singleCNOT).
- Returns:
The optimised Hamiltonian.
- Return type:
- ferrmion.hamiltonians.cube_lattice_adjacency_matrix(shape: tuple[int, int, int], periodic: bool) ndarray[tuple[int, ...], dtype[bool]][source]#
Creates an adjacency matrix for a 3D square lattice Hubbard Hamiltonian.
- Parameters:
shape (tuple[int, int, int]) – The number of sites.
periodic (bool) – If true, periodic boundary conditions are used.
- Returns:
Adjacency matrix for lattice sites.
- Return type:
np.ndarray[bool]
- ferrmion.hamiltonians.hubbard_coefficients(n_modes: int, adjacency_matrix: ndarray[tuple[int, ...], dtype[_ScalarType_co]], onsite_term: float, hopping_term: float = 1.0, spinless: bool = False) tuple[ndarray, ndarray][source]#
Coefficients to fill a Hubbard Hamiltonian Template.
- Parameters:
n_modes (int) – Number of fermion modes in the system.
adjacency_matrix (npt.NDArray) – Adjacency matrix of lattice sites.
onsite_term (float) – Onsite interaction term.
hopping_term (float) – Kinetic term.
spinless (bool) – Set to True to use single spin Hamiltonian.
- Returns:
one and two electron coefficients.
- Return type:
tuple
- ferrmion.hamiltonians.hubbard_hamiltonian(adjacency_matrix: ndarray[tuple[int, ...], dtype[_ScalarType_co]], onsite_term: float, hopping_term: float = 1.0, spinless: bool = False) FermionHamiltonian[source]#
Return a Hubbard model Hamiltonian.
As the Hubbard Hamiltonian has the same signature as the Chemists’ Molecular Hamiltonian (+-, +-+-), the molecular Hamiltonian functions are reused internally.
- Parameters:
adjacency_matrix (npt.NDArray) – Adjacency matrix of lattice sites.
onsite_term (float) – Onsite two-electron term.
hopping_term (float) – Kinetic term coefficient.
physicist_notation (bool) – Set to False for Chemist Notation.
spinless (bool) – Set to True to use single spin Hamiltonian.
- Returns:
A qubit Hamiltonian.
- Return type:
dict[str, float]
Example
>>> import numpy as np >>> from ferrmion.hamiltonians import hubbard_hamiltonian, linear_adjacency_matrix >>> adjacency = linear_adjacency_matrix(4, periodic=False) >>> fham = hubbard_hamiltonian(adjacency, onsite_term=2.0) >>> fham.n_modes 8
- ferrmion.hamiltonians.linear_adjacency_matrix(length: int, periodic: bool) ndarray[tuple[int, ...], dtype[bool]][source]#
Creates an adjacency matrix for a linear Hubbard Hamiltonian.
- Parameters:
length (int) – The number of sites.
periodic (bool) – If true, periodic boundary conditions are used.
- Returns:
Adjacency matrix for lattice sites.
- Return type:
np.ndarray[bool]
- ferrmion.hamiltonians.molecular_hamiltonian(one_e_coeffs: ndarray[tuple[int, ...], dtype[_ScalarType_co]], two_e_coeffs: ndarray[tuple[int, ...], dtype[_ScalarType_co]], constant_energy: float = 0.0, physicist_notation: bool = True) FermionHamiltonian[source]#
Return a molecular electronic structure Hamiltonian.
- Parameters:
one_e_coeffs (NDArray) – One electron hamiltonian coefficients in spinorb format.
two_e_coeffs (NDArray) – Two electron hamiltonian coefficients in spinorb format.
constant_energy (float) – Constant energy offset.
physicist_notation (bool) – Set to False for Chemist Notation.
Example
>>> import numpy as np >>> from ferrmion.hamiltonians import molecular_hamiltonian >>> one_e = np.eye(2) >>> two_e = np.zeros((2, 2, 2, 2)) >>> fham = molecular_hamiltonian(one_e, two_e, 0.0) >>> fham.n_modes 2
- ferrmion.hamiltonians.square_lattice_adjacency_matrix(shape: tuple[int, int], periodic: bool) ndarray[tuple[int, ...], dtype[bool]][source]#
Creates an adjacency matrix for a 2D square lattice Hubbard Hamiltonian.
- Parameters:
shape (tuple[int, int]) – The number of sites.
periodic (bool) – If true, periodic boundary conditions are used.
- Returns:
Adjacency matrix for lattice sites.
- Return type:
np.ndarray[bool]