API documentation
Migration from the fermion-only API
- Import
PauliDecompositionfromsecond_quantization.fermionsinstead ofsecond_quantization.pauli_strings. hilbert_space.basis_operatorsreturns(fermion_dict, boson_dict). Pass this pair unchanged asoperator_dictwhen reusing it into_matrix.- Matrix conversion,
symbolic_basis, and partial traces place fermions before bosons, preserving the input order within each type. The rightmost mode varies fastest. - Bosonic truncation
tincludes occupations0throught, givingt + 1states. An integer applies to every boson; a list follows the bosons' input order. Fermion-only calls need no truncation. - Parity is
0for even and1for odd total occupation for fermions, bosons, and mixtures. This preserves the fermion-only convention.
Symbolic parameters can be kept as dictionary keys for all particle types.
Pauli decomposition also accepts matrices with symbolic entries. Bosonic
inversion operates on numerical matrices and drops coefficients at or below
1e-10 by default; it reconstructs operators within the chosen finite cutoff.
Hilbert Space
basis_operators(operators, sparse, truncation=None)
Split fermionic and bosonic operators and build their matrix bases.
Fermionic operators are mapped through fermion_basis; bosonic operators
are mapped through boson_basis with the provided truncation. The return
value is a pair of dictionaries whose keys are 1 and the operator
symbols/powers that are explicitly constructed.
Raises
ValueError If non-fermion/boson symbols are provided or bosonic truncation is omitted when bosons are present.
Source code in second_quantization/hilbert_space.py
28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 | |
make_dict_callable(hamiltonian_dict)
Create a callable function from a dictionary of SymPy expressions and NumPy arrays.
This function takes a dictionary where keys are symbolic expressions (containing free symbols) and values are NumPy arrays, and creates a callable function that evaluates the weighted sum of the arrays based on the symbolic expressions.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
hamiltonian_dict
|
dict[Expr, ndarray]
|
A dictionary where keys are SymPy expressions (which may contain free symbols) and values are NumPy arrays of the same shape. |
required |
Returns:
| Type | Description |
|---|---|
callable
|
A callable function that takes values for all free symbols found in the |
callable
|
dictionary keys and returns the weighted sum: Σ(expr_value * array) where |
callable
|
expr_value is the numerical evaluation of each symbolic expression. |
Raises:
| Type | Description |
|---|---|
ValueError
|
If any symbol names would be converted to Dummy variables by SymPy's lambdify function. This typically happens with special characters or reserved names. |
Example
import sympy as sp
import numpy as np
# Define symbolic parameters
x, y = sp.symbols('x y')
# Create dictionary with symbolic expressions and matrices
ham_dict = {
x: np.array([[1, 0], [0, 0]]),
y: np.array([[0, 1], [1, 0]])
}
# Create callable function
func = make_dict_callable(ham_dict)
# Evaluate at specific parameter values
result = func(x=2.0, y=1.5) # Returns 2.0 * first_matrix + 1.5 * second_matrix
Source code in second_quantization/hilbert_space.py
172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 | |
parity_operator(operators, sparse, truncation=None)
Construct total occupation parity: 0 for even and 1 for odd.
Fermion and boson occupations contribute modulo two. Tensor factors follow
the order fermions then bosons, as in to_matrix.
Source code in second_quantization/hilbert_space.py
57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 | |
partial_trace_generators(subset, all_operators, sparse, operator_dict=None, truncation=None)
Projectors for tracing out fermionic and/or bosonic modes.
Constructs vectors that project onto each configuration of the complement of
subset while fixing subset in vacuum, enabling partial traces via the
recipe documented in the return value description.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
subset
|
list[Expr]
|
Modes to remove via tracing. |
required |
all_operators
|
list[Expr]
|
All modes in the system, ordered as in |
required |
sparse
|
bool
|
Whether to keep intermediate matrices sparse. |
required |
operator_dict
|
dict
|
Optional cached operator dictionaries. |
None
|
truncation
|
int | list[int] | None
|
Maximum bosonic occupations, or inferred from |
None
|
Returns:
| Type | Description |
|---|---|
ndarray
|
Array of projectors |
ndarray
|
traces out |
ndarray
|
fermions-first order of |
Source code in second_quantization/hilbert_space.py
378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 | |
symbolic_basis(operators, truncation=None)
Generate creation monomials in matrix basis order.
Fermions precede bosons, preserving the order within each particle type,
as in to_matrix. The rightmost mode varies fastest.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
operators
|
list[FermionOp | BosonOp]
|
Fermionic and/or bosonic modes. |
required |
truncation
|
int | list[int] | None
|
Maximum bosonic occupation, either shared or per boson. Required only when bosons are present. |
None
|
Returns:
| Type | Description |
|---|---|
list[Expr]
|
Creation monomials acting on vacuum, starting with |
list[Expr]
|
Bosonic powers are unnormalized: occupation |
list[Expr]
|
of |
Example
For 2 fermions [c, d], returns:
- [1, d†, c†, c†*d†] representing vacuum, single occupations, and double occupation.
Source code in second_quantization/hilbert_space.py
291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 | |
to_matrix(expression, operators, sparse, operator_dict=None, truncation=None)
Convert a symbolic operator expression to matrices.
Expands expression into normal products of the provided fermionic and/or
bosonic operators, builds matrix representations via tensor products, and
groups terms by their purely symbolic prefactor. Creation operators are
inferred via Dagger and implemented as conjugate-transposed annihilation
matrices.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
expression
|
Expr
|
SymPy expression containing the operators to expand. |
required |
operators
|
list[FermionOp | BosonOp]
|
Modes whose stable fermion partition, followed by their stable boson partition, sets the tensor-product ordering. |
required |
sparse
|
bool
|
If True, use sparse matrices for all operations. |
required |
operator_dict
|
dict
|
Optional cached |
None
|
truncation
|
int | list[int]
|
Truncation passed to bosonic basis construction when needed. |
None
|
Returns:
| Type | Description |
|---|---|
dict[Expr, ndarray | csr_array]
|
Dict mapping symbolic prefactors to the summed matrix representation of |
dict[Expr, ndarray | csr_array]
|
all terms that share that prefactor. |
Source code in second_quantization/hilbert_space.py
86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 | |
to_operators(matrix, basis, truncation=None)
Recover a normal-ordered operator expression from a matrix.
Dispatches to the appropriate inversion backend based on the operator
types present in basis:
- Fermionic only – Pauli decomposition + Jordan–Wigner inversion (original behaviour, requires dim = 2^n).
- Bosonic only – diagonal falling-factorial decomposition with
finite-difference inversion (requires
truncation). - Mixed – Pauli decomposition on the fermionic tensor structure
followed by bosonic inversion on each coefficient block (requires
truncation).
If a dictionary of matrices is supplied, each entry is converted and scaled by its symbolic key before summing.
Parameters
matrix : ndarray, csr_array, or dict thereof
Square matrix (or dict of matrices) in the Hilbert space defined by
basis and the tensor-product ordering of :func:to_matrix.
basis : list of FermionOp / BosonOp
Operators defining the Hilbert space. They are stably partitioned into
fermions followed by bosons, matching :func:to_matrix.
truncation : int, list of int, or None
Required when basis contains bosonic operators; passed to the
bosonic inversion backend.
Returns
sympy.Expr Normal-ordered symbolic expression.
Source code in second_quantization/hilbert_space.py
460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 | |
Fermions
PauliDecomposition(matrix, threshold=0.0)
Decompose a matrix into Pauli-string coefficients.
Parameters
matrix : np.ndarray | scipy.sparse.spmatrix | sympy.Matrix Square matrix with power-of-two dimension. threshold : float Omit coefficients whose absolute value is not larger than this value. Retain symbolic coefficients whose magnitude cannot be determined.
Returns
dict[str, complex | float | sympy.Basic] Pauli strings mapped to scalar coefficients.
Raises
ValueError
If matrix is not square or its dimension is not a power of two.
Source code in second_quantization/fermions.py
140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 | |
fermion_basis(operators, sparse)
Build Jordan–Wigner annihilation matrices.
Parameters
operators : list[sympy.Expr] Fermionic modes in tensor-product order. sparse : bool Return CSR arrays instead of dense arrays.
Returns
dict[sympy.Expr, np.ndarray | scipy.sparse.csr_array] Full-space identity and one annihilation matrix per mode.
Source code in second_quantization/fermions.py
16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 | |
fermion_parity(operators, sparse)
Build the fermionic occupation-parity matrix.
Parameters
operators : list[sympy.Expr] Fermionic modes defining the register. sparse : bool Return a CSR array instead of a dense array.
Returns
np.ndarray | scipy.sparse.csr_array Diagonal matrix with 0 for even and 1 for odd occupation.
Source code in second_quantization/fermions.py
55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 | |
string_to_fermion_operators(pauli_str, fermion_ops)
Convert a Pauli string through the inverse Jordan–Wigner map.
Parameters
pauli_str : str
String containing I, X, Y, and Z labels.
fermion_ops : list[sympy.Expr]
Fermionic modes corresponding to the string positions.
Returns
sympy.Expr Fermionic operator expression before normal ordering.
Source code in second_quantization/fermions.py
173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 | |
Bosons
BosonDecomposition(matrix, truncation, threshold=1e-10)
Decompose a matrix into normal-ordered bosonic coefficients.
Parameters
matrix : np.ndarray | scipy.sparse.csr_array
Square matrix with dimension prod(t + 1 for t in truncation).
truncation : list[int] | int
Per-mode cutoffs; a scalar describes one mode.
threshold : float
Omit coefficients whose absolute value is not larger than this value.
Returns
dict[tuple[tuple[int, int], ...], complex | float]
Per-mode (creation, annihilation) powers mapped to coefficients.
Raises
ValueError If the matrix shape and truncation are incompatible.
Source code in second_quantization/bosons.py
211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 | |
boson_basis(operators, truncation, sparse)
Build truncated bosonic annihilation-power matrices.
Parameters
operators : list[sympy.Expr] Bosonic modes in tensor-product order. truncation : list[int] | int Per-mode cutoffs; a scalar applies to every mode. sparse : bool Return CSR arrays instead of dense arrays.
Returns
dict[sympy.Expr, np.ndarray | scipy.sparse.csr_array] Full-space matrices for powers zero through each mode's cutoff.
Raises
ValueError If the number of cutoffs does not match the number of modes.
Source code in second_quantization/bosons.py
24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 | |
boson_parity(operators, truncation, sparse)
Build the bosonic occupation-parity matrix.
Parameters
operators : list[sympy.Expr] Bosonic modes in tensor-product order. truncation : list[int] | int Per-mode cutoffs; a scalar applies to every mode. sparse : bool Return a CSR array instead of a dense array.
Returns
np.ndarray | scipy.sparse.csr_array Diagonal matrix with 0 for even and 1 for odd total occupation.
Raises
ValueError If the number of cutoffs does not match the number of modes.
Source code in second_quantization/bosons.py
90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 | |
boson_to_operators(matrix, operators, truncation, threshold=1e-10)
Recover a normal-ordered bosonic expression from a matrix.
Parameters
matrix : np.ndarray | scipy.sparse.csr_array Square matrix in the truncated bosonic basis. operators : list[sympy.Expr] Bosonic modes in tensor-product order. truncation : list[int] | int Per-mode cutoffs; a scalar applies to every mode. threshold : float Omit coefficients whose absolute value is not larger than this value.
Returns
sympy.Expr
Normal-ordered expression in operators.
Source code in second_quantization/bosons.py
262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 | |