Source code for dopyqo.transform_matrices

import numpy as np


[docs] def transform_one_body_matrix(one_body_matrix: np.ndarray, transform_matrix: np.ndarray) -> np.ndarray: assert one_body_matrix.ndim == 2 assert transform_matrix.ndim == 2 assert one_body_matrix.shape == (one_body_matrix.shape[0],) * 2 assert transform_matrix.shape == (transform_matrix.shape[0],) * 2 # <p|V|q> = \sum_{i,j} <i|p>* <i|V|j> <j|q> # where <i|p> is transform_matrix # and <i|V|j> is one_body_matrix res = np.einsum("ip, ij, jq -> pq", transform_matrix.conj(), one_body_matrix, transform_matrix) return res
[docs] def transform_two_body_matrix(two_body_matrix: np.ndarray, transform_matrix: np.ndarray) -> np.ndarray: assert two_body_matrix.ndim == 4 assert transform_matrix.ndim == 2 assert two_body_matrix.shape == (two_body_matrix.shape[0],) * 4 assert transform_matrix.shape == (transform_matrix.shape[0],) * 2 # <pq|V|rs> = \sum_{i,j,k,l} <i|p>* <j|q>* <ij|V|kl> <k|r> <l|s> # where <i|p> is transform_matrix # and <ij|V|kl> is two_body_matrix res = np.einsum( "ip, jq, ijkl, kr, ls -> pqrs", transform_matrix.conj(), transform_matrix.conj(), two_body_matrix, transform_matrix, transform_matrix, ) return res
[docs] def to_density_matrix(active_electrons, active_orbitals): diag_density = [] electrons = active_electrons orbitals = active_orbitals while electrons > 0 and len(diag_density) < orbitals: diag_density.append(2) electrons -= 2 diag_density.extend([0] * (orbitals - len(diag_density))) density_mat = np.diag(diag_density) return density_mat