All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
- Deprecated the ignored
atolandepsarguments ofdirect_greens_function. They will be removed in version 2.4.0. - Deprecated
solver_options["atol"]andsolver_options["eps"]for the implicit direct solver. They will be removed in version 2.4.0. - Deprecated the legacy one-argument custom Sylvester callback form
solve_sylvester(Y). Usesolve_sylvester(Y, index)instead. The legacy form will be removed in version 2.4.0.
- Reworked the implicit direct solver to constrain known degenerate kernels using QR-selected pivot equations instead of relying on MUMPS singularity detection, and added a SciPy sparse-LU fallback when
python-mumpsis unavailable.
- Added a non-Hermitian similarity-transform algorithm via
block_diagonalize(..., hermitian=False), including support for asymmetric selective masks, symbolic inputs, and biorthogonalsubspace_eigenvectors=[(right, left), ...]in the explicit and implicit direct paths. The implicit KPM solver remains unsupported in the non-Hermitian path.
- Made python-mumps an optional dependency, only required for the implicit solver.
- When SymPy cannot determine whether an off-diagonal zeroth-order block is zero, emit a warning and proceed instead of erroring.
- Dropped support for Python 3.11, numpy 1.26, and scipy 1.12 according to the SPEC-0.
- Added a reference implementation of arbitrary order Schrieffer-Wolff transformation to the documentation and a comparison of its convergence radius with Pymablock algorithm.
- Added support for bosonic, fermionic, spin, and ladder (Floquet) second-quantized Hamiltonians in the operator formalism.
- Added a tutorial on the Rabi model with a periodic drive.
- Added documentation for the second quantization formalism.
- Added a comparison with Schrieffer-Wolff and a demonstration of the convergence radius.
- If the Hamiltonian contains only one block,
fully_diagonalizecan be provided asvalueinstead of{0: value}. - Updated the dispersive shift tutorial to include the second quantization approach.
- Updated the Jaynes-Cummings tutorial to the new second quantization API.
- Dropped support for Numpy 1.25, Scipy 1.11, and Sympy 1.12 according to the SPEC-0.
- Generalized the algorithm to support an arbitrary number of blocks. To specify multiple blocks, provide either a list with eigenvectors of each block in
subspace_eigenvectors, or a list marking to which block each basis state belongs insubspace_indices. - Implemented full diagonalization of the Hamiltonian within blocks except for degenerate eigensubspaces. In case of one block with non-degenerate eigenvalues, this implements the Rayleigh-Schrödinger perturbation theory.
- Implemented selective diagonalization of the Hamiltonian within blocks, which can eliminate any subset of the off-diagonal elements within a block.
- Implemented functionality for making optimized series algorithms, see {autolink}
~pymablock.algorithm_parsing.series_computationand a domain-specific language to define those. This is an advanced and an experimental feature, subject to change. - Added a function
operator_to_BlockSeriesto transform operators to the same representation as the Hamiltonian, and illustrated its use in the tutorial. - Included a tutorial on how to manipulate complex symbolic Hamiltonians and demonstrate multi-block diagonalization.
- Included a tutorial on how to compute the dispersive shift in a transmon-resonator system.
- Auxiliary vectors for the implicit KPM solver should now be passed using
solver_options["aux_vectors"]rather than as the last entry insubspace_eigenvectors.
- Further reduced the number of matrix products by around 30% for high orders and down to a guaranteed minimum for 3rd order.
- Improved the efficiency of the MUMPS solver on real Hamiltonians.
- Allowed subspaces to have degenerate eigenvalues if the corresponding energy denominators are never used. This may happen in multiblock perturbation theory.
- Fix incorrect shape of {autolink}
~pymablock.BlockSeriesblocks if$H_0$ has a zero block (#127).
- Dropped support for Python 3.10 and sympy 1.11 according to the SPEC-0.
- Switched to the
python-mumpswrapper for the direct solver, which is available on all platforms and is more feature-complete. - The implicit KPM solver now guarantees reaching a requested accuracy.
- A new algorithm that has optimal scaling while avoiding multiplication by
$H_0$ , and supports implicit data. This combines advantages of all previous algorithms, and therefore supersedes them. - Sped up {autolink}
~pymablock.series.cauchy_dot_productwhen there are more than 3 series by reusing intermediate results. - Optimized memory usage of
~pymablock.block_diagonalizeby deleting intermediate results when they are no longer needed.
- A complete description of the algorithm to the documentation, see documentation.
- String representation of {autolink}
~pymablock.BlockSeriesfor readability.
expanded,symbolic,implicit, andgeneralfunctions and algorithms (functionality taken over by the new general algorithm, with {autolink}~pymablock.block_diagonalizethe main interface).- the
algorithmargument from {autolink}~pymablock.block_diagonalize(there is only one algorithm now). exclude_lastargument of {autolink}~pymablock.series.cauchy_dot_product(instead we check whtether other terms lack 0th order).
- First release of Pymablock.