bsym v2.2.0
Bug fixes, correctness improvements, and performance optimisations.
Bug Fixes
- Mutable default argument in
SymmetryGroup.__init__: all instances shared the same list, risking cross-contamination between groups. - Stale caches after
extend()/append():unique_index_mappingsandstacked_index_mappingsare now invalidated when operations are added. - Infinite loop risk in
random_unique_configurations: added amax_attemptsparameter (default 1000) withRuntimeErrorwhen the configuration space appears exhausted. - Uniform sampling failure counter: rejection by the acceptance test no longer counts as a failure to find a novel configuration, preventing spurious
RuntimeErrorfor highly degenerate configurations. - Wrong
class_strinSpaceGroup: was'SymmetryGroup'instead of'SpaceGroup'. bsym.bsymcalledsys.exit()on import; replaced withraise ImportError(...).SymmetryGroup.__mul__lost subclass type:SpaceGroup * SpaceGroupreturned a plainSymmetryGroup; now preserves the left operand's type.
Performance Optimisations
- Matrix transpose for permutation inversion instead of
np.linalg.inv. np.argmaxforindex_mappingandas_vectorinstead of Python loops.- Set-based deduplication of symmetry operation vectors in the pymatgen interface.
- Vectorised
apply_species_mappingusing numpy fancy indexing. - End-to-end: 3.9x speedup on ternary composition enumeration, 2.4x on random sampling.
Code Hygiene
- Fixed type annotations for cache fields and
labelsproperty inSymmetryGroup. - Updated
SymmetryOperation.__init__docstring to document deprecatednp.matrixacceptance. - Removed outdated docstrings referencing
numpy.matrixsubclassing. - Removed unused imports and duplicate
permutation_as_config_numberfunction. - Simplified
SymmetryOperation.__init__type checking. - Replaced deprecated
tqdm_notebookwithtqdm.auto.
CI
- Build workflow now triggers only on pull requests (main is a protected branch).
Breaking Changes
permutation_as_config_number(module-level function inconfiguration_space) has been removed.- Importing
bsym.bsymnow raisesImportErrorinstead of callingsys.exit().