Changelog#
Changelog#
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.
[1.1.0] - 2026-05-29#
Maintenance and polish release: verified bug fixes (several affecting numerical output on specific paths), documentation accuracy, test-suite hygiene, and release-process improvements. All fixes ship with regression tests.
Fixed#
FastNN.encodesilent mis-scaling for 6-sample batches (affects output): a 2-D input of shape(6 params, 6 samples)broadcast against the parameter bounds without error and normalized along the wrong axis, producing silently corrupted SEDs/bolometric corrections only when exactly 6 valid samples were evaluated (reached viaStellarPopsynthesis). Now dispatches on input dimensionality explicitly.los_dustkernels collapsing per-object cloud means (affects output):kernel_gauss/kernel_lorentz/kernel_tophatcollapsed an array-valued mean to a scalar, so line-of-sight fits using a reddening template (template_reds,additive_foreground) evaluated every object against object 0’s cloud mean. Means are now kept broadcastable. The default uniform-cloud path is unchanged.Binary companions no longer discard a valid primary SED (affects binary grid generation):
StarEvolTrack.get_sedsreturned an all-NaN combined SED (dropping the valid primary) when the secondary’s age could not be matched to the unrealistically tight default tolerance. The defaulttolis relaxed1e-6 -> 1e-2dex and a primary-only fallback is used when the companion does not converge. Regenerate binary (smf>0) grids to benefit; single-star fitting and the shipped default grids are unaffected.load_offsetsno longer crashes on a single-filter offsets file.logp_imfno longer raisesZeroDivisionErrorfor a power-law slope of exactly 1.0 (flat-in-log); uses the logarithmic mass integral._fetch(data download) removes a stale/broken symlink before re-linking and falls back to a file copy on filesystems without symlink support.BruteForce.logpost_gridfloors the Monte-Carlo sample count at 1 (a very smallmem_limcould drive it to 0 and crash).BruteForce.loglike_gridguards the dimensional-priorlog(Ndim)term and fails fast with a clear error on a fully-masked object (was an opaqueZeroDivisionErrordeep in the optimizer).cornerplotno longer mutates a caller-suppliedlabelslist in place.dist_vs_redusesinterpolation="none"so binned PDF images show raw bins; fixed a no-op smoothing guard inhist2d.Removed a dead
from scipy import polyfitimport (scipyhas no top-levelpolyfit; the code always usednumpy.polyfit).
Changed#
Python support: dropped end-of-life Python 3.8 (
requires-python>=3.9); added 3.13 to the classifiers and tooling targets.Dependencies: raised the
numbafloor to>=0.59.0(the old 0.53 floor predatesnumpy>=1.22/2.x support);numpyremains uncapped (the code is numpy-2.0 clean, verified on 2.2).Documentation engine: standardized on a single NumPy-docstring processor (
napoleon); removed the redundantnumpydocextension. The docs now build with zero warnings.Tutorials: standardized on the committed
Orion_l209.1_b-19.9example field; replaced chi2/Nbands quality cuts with goodness-of-fit p-values.
Documentation#
Corrected numerous stale code examples across the docs and docstrings to match the real API (
StarGrid(models, labels),get_seds3-tuple in magnitudes,magnitude(flux, err),sample_multivariate_normal(size=), the prior call signatures,samps_dred, the data cache path/env var, real filter names, and the maggies flux convention).Added
summary_plotto the API reference; documentedBruteForce.fit’s performance/accuracy parameters (max_models,precision_shrinkage,subsample_mode,R_solar,Z_solar); reframed fit-quality guidance around the p-value methodology.
Testing & packaging#
Added regression tests covering every fix above; reconciled the
conftestcoverage guidance with what CI actually runs (NUMBA_DISABLE_JIT=1 pytest --cov); the defaultpytestrun no longer enables coverage (which crashed on some WSL/DrvFs paths).Added a tag-triggered PyPI publish workflow (Trusted Publishing); fixed the stale
MANIFEST.indata-file path.
[1.0.0] - 2025-12-08#
First stable release of brutus following code verification, testing, and documentation improvements.
Added#
Documentation: Scientific background pages, user guides, API documentation with examples, and ReadTheDocs hosting
Testing: 92% code coverage, 606 tests, GitHub Actions CI/CD with Codecov integration
Code verification: All functions verified for correctness; fixed IMF normalization bug, StarGrid distance reference, and other issues
Changed#
Development status updated to Production/Stable
Added
tqdmas formal dependencyEnforced Black formatting across codebase
[0.9.0] - 2024-08-28#
Major refactoring to improve usability and maintainability while preserving scientific functionality.
Added#
Modern packaging: Migrated to
pyproject.tomlwith black, isort, flake8, mypyTesting: pytest framework with 100+ tests, coverage reporting, multi-platform CI
Modular architecture: Split into
brutus.core,brutus.analysis,brutus.plotting,brutus.dust,brutus.utils,brutus.data,brutus.priorsPerformance: Numba JIT compilation, vectorized operations, improved caching
Changed#
Minimum Python version: 3.8+ (dropped Python 2.7)
Split large modules (
utils.py,plotting.py) into focused submodulesUpdated all dependencies to modern versions
Fixed#
Windows/WSL compatibility documentation
Circular imports and module loading issues
Infinite loop bug in
hist2dfunction
Migration#
Update imports:
# Old
from brutus.seds import Isochrone
from brutus.fitting import BruteForce
# New
from brutus import Isochrone, BruteForce
# or
from brutus.core import Isochrone
from brutus.analysis import BruteForce
All scientific algorithms, file formats, and core APIs remain unchanged.
[0.8.3] - Previous Release#
Final release using old project structure and Python 2 compatibility.
Features: individual star fitting, cluster modeling, 3D dust mapping, MIST support, neural network SED prediction.
For migration questions or bug reports, see the issue tracker.