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.
0.3.0 - 2026-08-28¶
Added¶
- Added Optuna/TPE hyperparameter optimization for tunable classifiers with a
declared per-search trial budget configured through
[optimization].n_trials. - Added a backend-independent internal search-space contract supporting discrete, integer, continuous, and conditional parameter definitions.
- Added
optimization_searches.csv, preserving one row per completed outer or final optimization search. - Added
optimization_provenance.json, recording the effective optimization backend, policy, cross-validation design, random state, trial budget, and active search-space contracts.
Changed¶
- Replaced
GridSearchCVwith Optuna as the optimization engine for tunable classifiers while preserving nested outer-CV evaluation and mean outer-CV F1-macro classifier selection. - Hyperparameter-search effort is now controlled by an explicit and homogeneous trial budget rather than by the implicit size of classifier-specific grids.
- The fixed v0.3.0 optimization policy uses seeded sequential TPE from MELITE's
canonical
RANDOM_STATE; the normal default is 100 trials per search and smoke mode uses an internal 5-trial budget. melite runnow performs and persists the final full-data optimization for a selected tunable classifier;melite exportreuses the parameters stored inresults.csvand performs no additional hyperparameter search.- Hyperparameters persisted in
results.csv.parametersnow retain their full numeric precision somelite exportcan reconstruct the exact configuration selected bymelite run. - Updated public documentation, package metadata, citation metadata, configuration guidance, and the evaluation-workflow figure for the v0.3.0 optimization and evidence contracts.
Notes¶
- Scientific characterization used one frozen synthetic dataset with 240 samples and 20 features, evaluated with SVC, Random Forest, and XGBoost under 5-fold × 1-repeat outer cross-validation, 3-fold inner cross-validation, and 100 Optuna trials per search.
- Under that fixed condition, all three tunable classifiers remained within the
predefined
-0.05mean outer-CV F1-macro acceptance margin, and SVC remained the selected classifier. - The estimated optimization workload decreased from 42,208 to 4,816 estimator fits under that condition. End-to-end wall-clock was 2981.1 s for the v0.2.5 baseline and 3005.0 s for v0.3.0; wall-clock was descriptive and not an acceptance gate.
- Public custom-classifier registration remains outside the v0.3.0 scope; the supported classifier keys remain SVC, Random Forest, XGBoost, and opt-in Stacking.
0.2.5 - 2026-08-25¶
Added¶
- Added registered CSV dataset input using a configured
label_column. - Added automated documentation/schema drift protection based on the actual
ResultManagerCSV writers. - Added a deferred-product-decisions page with explicit observable revisit criteria.
Changed¶
- Formalized the column-level contracts for
results.csv,evaluations.csv, andevaluation_folds.csvin the public usage documentation. - Migrated the bundled example from separate NPZ and NPY resources to a single synthetic numeric CSV dataset.
- Updated the Quick Start and public input documentation to present CSV as the recommended registered-dataset path.
- Updated installed-wheel smoke validation to exercise the bundled CSV example end to end.
- Updated public discovery keywords to emphasize general tabular and CSV usage instead of PCA/UMAP-specific representation terminology.
- Registered dataset configuration now validates supported extensions
explicitly (
.npzand.csv). - Unknown fields in
[datasets.*]are now rejected instead of silently ignored. These validation changes may reject configurations that were previously accepted accidentally.
0.2.4 - 2026-08-25¶
Added¶
- Added the packaged
melite exampleQuick Start with deterministic synthetic numeric tabular data, available directly from an installed distribution and verified through installed-wheel smoke testing. - Added Ruff linting and formatting plus Mypy type checking as permanent CI quality gates.
- Added README contract tests covering canonical CLI commands, configuration terminology, local links, and version synchronization.
- Added persistent classifier evaluation evidence through
evaluations.csv, with one aggregate row per dataset and active classifier. - Added
evaluation_folds.csvwith one row per dataset, classifier, and outer-CV split, preserving the raw evidence used for classifier selection. - Added one dataset-level F1-macro evidence figure under
output/figures/, showing the existing outer-CV scores for every evaluated classifier and marking the selected classifier without running additional cross-validation.
Changed¶
- Stabilized the public Python API around
Config,load_datasets,plot_f1_macro_evidence,predict, and__version__; complete evaluation remains available through themelite runCLI workflow. - Consolidated the public Quick Start around the packaged example and removed
the redundant repository-level
examples/workflow andenvironment.yml;pyproject.tomlis now the dependency source of truth. - Adopted the public product identity MELITE — Multi-Model Classifier Evaluator.
- Classifier selection is now based on mean outer-CV F1-macro from the evaluation evidence retained for every active classifier.
- Stacking graduated from experimental status to a stable opt-in classifier; it remains disabled by default.
- Standalone SVC evaluation now avoids probability fitting, while exported SVC artifacts and the SVC base estimator inside stacking retain probability support where required.
- Evaluation parallelism now avoids nested estimator parallelism: inner grid search or stacking owns parallel execution while contained estimators run single-threaded.
- Evaluation and smoke-mode terminology was aligned throughout the package, documentation, CLI, and generated reports.
- Renamed
[models]/ACTIVE_MODELSto[classifiers]/ACTIVE_CLASSIFIERS; existing configuration users must rename the[models]section to[classifiers]. - Renamed the evaluation CSV field
model_nametoclassifier_nameinresults.csv,evaluations.csv, andevaluation_folds.csv; external CSV consumers must update that column name. - Narrowed the public
Configsurface: legacy-reduction state, hyperparameter- grid internals, redundant accessors, and runtime setup are no longer public API.RANDOM_STATEis now the single public random-seed value, andCV_CONFIGcontains onlyn_splits,n_repeats, andinner_n_splits. - Explicit
[cv].random_stateand[cv_smoke].random_statesettings are now rejected with a clear configuration error; the canonical location is[benchmark].random_state. - Replaced the former three-metric CV distribution plot API with
plot_f1_macro_evidence(), focused on the outer-CV F1-macro evidence used for classifier selection.
Fixed¶
- Result and evaluation persistence failures now propagate to callers instead of being silently printed and ignored.
- Corrected tunable-classifier evaluation so hyperparameter search occurs inside each outer cross-validation split, separating hyperparameter tuning from classifier evaluation.
- Aligned stacking export reconstruction with the configured internal stratified CV strategy used during training.
- Removed the post-selection cross-validation step from
melite export. Export now reconstructs the selected model, fits it on all available data, and saves the final.pklartifact without producing a second evaluation. - Preserved the role of
results.csvas the selected-classifier summary while separating full evaluation evidence into dedicated output files.
Notes¶
- The legacy
[benchmark]configuration section remains supported for backward compatibility. - Stacking remains opt-in; the default active classifiers are SVC, Random Forest, and XGBoost.
- Optuna and MLflow remain outside the scope of v0.2.4.
0.2.3 - 2026-06-01¶
Added¶
- Added opt-in experimental stacking via the
stackmodel key in[models].active. - Added sklearn
StackingClassifiersupport usingstack_method="predict_proba",passthrough=False, andLogisticRegressionas the final estimator. - Added export and prediction coverage for saved stacking
.pklartifacts.
Changed¶
- Standalone SVC remains a
StandardScaler->SVCpipeline. - The SVC base estimator inside stacking is also scaled and uses
SVC(probability=True)so stacking combines probability outputs. - Random Forest and XGBoost remain unscaled direct estimators because they are tree-based models and do not require feature scaling by default.
- Stacking-internal CV uses the configured split count and random state with one repeat to satisfy sklearn's out-of-fold prediction requirements.
Notes¶
- Stacking is experimental and disabled by default.
- Export remains
.pklviajoblib. - Optuna and MLflow are intentionally out of scope for v0.2.3.
0.2.2 - 2026-05-28¶
Changed¶
- SVC is now trained as a
StandardScaler->SVCsklearnPipeline. - Scaling is applied only to SVC;
RandomForestClassifierandXGBClassifierremain unscaled direct estimators. - The full SVC search grid now includes a linear kernel with
svc__Cvalues[0.01, 0.1, 1, 10]. - Exported SVC models now preserve the same
StandardScaler->SVCpipeline used during benchmarking.
Compatibility¶
- Legacy export compatibility is preserved for older SVC parameter
dictionaries that use unprefixed keys such as
Candkernelinstead of pipeline keys such assvc__Candsvc__kernel.
0.2.1 - 2026-05-27¶
Changed¶
[models].active/ACTIVE_MODELSnow controls which model families are trained during benchmarking.melite exportnow uses strict dataset loading for registry-based datasets and no longer falls back toarr.files[0]when an.npzfile lacksX.- Added an installed-wheel smoke test that builds the wheel, installs it
outside the repository checkout, runs a toy
[datasets.toy]smoke benchmark, exports row 0 non-interactively, and verifies generated artifacts.
Compatibility¶
- The top-level public API remains unchanged:
Config,load_datasets,plot_cv_distributions,predict, and__version__. - Legacy
reduction_type+levelexport rows remain supported, but individual legacy.npzfiles must now contain an explicitXarray.
0.2.0 - 2026-05-26¶
Added¶
- Added canonical
[datasets.<dataset_id>]TOML registry entries for user-defined numeric tabular datasets. - Added strict generalized dataset loading through
load_datasets(config). - Added dataset-aware benchmark result rows with
dataset,family,method,variant,level, anddescriptionfields. - Added dataset-aware final export naming, such as
Model_SVC_morgan_r2_2048.pklandSVC_morgan_r2_2048.png.
Changed¶
melite runnow consumescfg.DATASETSas the canonical execution path.- PCA and UMAP inputs are treated as ordinary dataset registry entries.
- Legacy
[benchmark].reduction_typesandlevelsare normalized into dataset entries when[datasets]is absent. melite exportprefers the newdatasetcolumn and falls back to legacyreduction_type+levelrows for older CSV files.
Fixed¶
- Registered datasets now fail clearly on missing files, missing
X, non-2D or non-numericX, X/y length mismatch, and embedded-y mismatch.
0.1.11 - 2026-05-26¶
Changed¶
- Prepared documentation and package metadata for the first PyPI publication as
melite. - Updated release metadata to use final version
0.1.11instead of development or previous release references. - Clarified that MELITE is tabular at the modeling level: learning algorithms
consume numeric
Xandyarrays that may come from PCA, UMAP, fingerprints, descriptors, clinical variables, experimental measurements, industrial features, or manually selected numeric features. - Clarified that the current dataset orchestration still reflects MELITE's PCA/UMAP origin and uses concepts such as reduction type and level.
- Documented generalized
[datasets.*]definitions as a future direction, not current behavior.
Notes¶
- No functional behavior changes were made to training, model selection, cross-validation, export, prediction, dataset loading, or CLI commands.
0.1.10 - 2026-05-25¶
Changed¶
- Renamed the project identity from MOSAIC to MELITE.
- Renamed the Python import package from
mosaictomelite. - Renamed the CLI command from
mosaictomelite. - Renamed the PyPI distribution target from
mosaic-tabulartomelite. - Updated repository, documentation, CI, and publishing metadata for
NanoBiostructuresRG/melite. - Updated public API imports to remain the same symbols under
melite. - Updated result report headers to use MELITE branding and current CLI commands.
Fixed¶
- Replaced the duplicated SVC RBF
C = 0.02grid value withC = 0.2.
Validation¶
python -m pytest tests/ -v --basetemp=.review_pytest_tmp -o cache_dir=.review_pytest_cache— 82 passed, 1 warning, 0 failed.melite --help,melite run --help,melite export --help, andmelite --version— passed.- Public API smoke test —
OK: 0.1.10. python -m build—melite-0.1.10.tar.gzand.whlbuilt successfully.python -m twine check dist/*— PASSED.mkdocs build --strict— build succeeded with no errors.- Wheel includes
melite/,melite/config_default.toml, metadata, and license files. - Sdist inspected; local virtual environments, caches, generated review/docs
artifacts, build folders, raw/data/output folders, egg-info,
.pkl, and.joblibartifacts were not present.
0.1.9 - 2026-05-25¶
Added¶
- Added dedicated MkDocs pages for installation, quick start, CLI reference, configuration, and release notes.
- Added a home-page workflow diagram:
X / y -> mosaic run -> results.csv -> mosaic export -> .pkl -> predict(). - Added a "MOSAIC does / does not" scope table to clarify project boundaries.
Changed¶
- Reworked
docs/index.mdinto a concise project overview with links to the dedicated documentation pages. - Updated
mkdocs.ymlnavigation to expose the expanded documentation set. - Updated
README.mdfordev/v0.1.9, test-suite status, live documentation links, and planned PyPI publication asmosaic-tabular. - Bumped version to
0.1.9inversion.pyandCITATION.cff.
Validation¶
mkdocs build --strict— build succeeded with no errors.pytest tests/ -v— 82 passed, 1 warning, 0 failed.python -m build—mosaic_tabular-0.1.9.tar.gzand.whlbuilt successfully.python -m twine check dist/*— PASSED.mosaic --version->MOSAIC 0.1.9.- Wheel and sdist contents inspected; local virtual environments, caches,
generated review artifacts, build folders, raw/data/output folders,
egg-info,
.pkl, and.joblibartifacts were not present.
0.1.8 - 2026-05-25¶
Added¶
- Added
.github/workflows/publish-to-pypi.yml— manual PyPI publish workflow triggered viaworkflow_dispatch. Validates tag format, verifies package version matches tag, builds wheel and sdist, checks distributions, and publishes via trusted publishing (OIDC, no API token required). - Added
dist/to.gitignore.
Changed¶
- Renamed PyPI package from
mosaic-mltomosaic-tabularinpyproject.toml. - Updated
descriptioninpyproject.tomlto:"Tabular classification benchmarking toolkit for model selection, repeated stratified cross-validation, final model export, and artifact-based inference." - Updated
docs/api.mdto includepredictin the public API reference. - Updated
docs/index.md: version badge, pre-stable note, four-card panel,predicttab in Python API examples,predictin public API table. - Updated
docs/stylesheets/extra.css: added.ms-grid--fourlayout class. - Updated
README.md: corrected all references frommosaic-mltomosaic-tabular, replaced "inference" with "artifact-based inference" throughout, updated roadmap and notes. - Bumped version to
0.1.8inversion.pyandCITATION.cff.
Validation¶
python -m build—mosaic_tabular-0.1.8.tar.gzand.whlbuilt successfully.python -m twine check dist/*— PASSED.mkdocs build --strict— build succeeded with no errors.pytest tests/ -v— 80 passed, 1 warning, 0 failed.mosaic --version→MOSAIC 0.1.8.
0.1.7 - 2026-05-25¶
Added¶
- Added
mosaic/predict.py— inference module exposingpredict()as a stable public API symbol. Loads a.pklartifact, returns predictions and class probabilities for a new feature matrix. - Added
predicttomosaic/__init__.pyand__all__. - Added
.github/workflows/ci.yml— CI workflow: tests on Python 3.11 and 3.12, public import boundary check, wheel and sdist smoke installs, docs build. - Added
.github/workflows/docs.yml— deploys MkDocs site to GitHub Pages on push tomain. - Added synthetic example dataset under
examples/: sample_labels.npy— 100 binary labels, balanced classes.sample_PCA70.npz— 100×37 feature matrix withXandykeys.example_config.toml— TOML config pointing to example files.generate_sample_data.py— reproducible generation script (seed=42).- Added
tests/test_predict.py— 11 tests for the inference module. - Added
tests/test_examples.py— 11 tests for example dataset integrity. - Added
tmp_modelfixture totests/conftest.py— trained SVC saved as.pkl. - Added
.pytest_tmpto.gitignore.
Changed¶
- Updated
tests/test_public_api.py— addedpredictimport and__all__tests. Total test count: 80 tests. - Rewrote
README.mdcombining outside-in user perspective with full developer documentation. - Updated
mosaic/__init__.pypublic API docstring to includepredict. - Bumped version to
0.1.7inversion.pyandCITATION.cff.
Validation¶
pytest tests/ -v— 80 passed, 1 warning, 0 failed.mosaic run --smoke --config examples/example_config.toml— completed successfully.predict()returns correct shapes for predictions and probabilities.- CI workflow passes on Python 3.11 and 3.12 (GitHub Actions).
mkdocs build --strict— build succeeded.
0.1.6 - 2026-05-23¶
Added¶
- Added NumPy-style docstrings to all 10 modules:
__init__.py,version.py,config.py,load_dataset.py,result_manager.py,plot_metrics.py,model_training.py,export_best_model.py,main.py, andcli.py. - Added MkDocs documentation site with
mkdocs-materialtheme: mkdocs.yml— site configuration with MOSAIC steel-blue + amber palette.docs/index.md— home page with hero section, quick start, and Python API examples.docs/api.md— API Reference generated from docstrings viamkdocstrings.docs/changelog.md— changelog page (includesCHANGELOG.md).docs/stylesheets/extra.css— custom MOSAIC theme styles.
Changed¶
- Bumped version to
0.1.6inversion.pyandCITATION.cff.
Validation¶
pytest tests/ -v— 57 passed, 1 warning, 0 failed.mkdocs build --strict— build succeeded with no errors.mkdocs serve— site renders correctly locally.python -c "help(mosaic.Config)"— docstring visible.
0.1.5 - 2026-05-23¶
Added¶
- Defined stable public API in
mosaic/__init__.py:Config,load_dataset,ResultManager,plot_cv_distributions, and__version__are now importable directly frommosaic. - Added
__all__to all modules:config.py,load_dataset.py,result_manager.py,plot_metrics.py,model_training.py,export_best_model.py, andcli.py. - Added
tests/test_version.py— 6 tests for version metadata. - Added
tests/test_public_api.py— 7 tests for public API imports and__all__. - Added
tests/test_plot_metrics.py— 5 tests for PNG output and directory creation. - Added
tests/test_cli.py— 8 tests for CLI help and version output. - Added
pytesttoenvironment.yml.
Changed¶
mosaic/__init__.pynow exposes the stable public API with explicit imports and__all__. Users can dofrom mosaic import Config, load_dataset.- Bumped version to
0.1.5inversion.pyandCITATION.cff.
Validation¶
pytest tests/ -v— 57 passed, 1 warning (expected Agg backend warning), 0 failed.from mosaic import Config, load_dataset, ResultManager, plot_cv_distributions, __version__✓mosaic.__all__contains exactly the 5 expected public symbols ✓- CLI help and version tests pass via subprocess ✓
0.1.4 - 2026-05-22¶
Added¶
- Added formal
pytestsuite undertests/with 31 tests coveringConfig,load_dataset,ResultManager, andFinalizer. - Added
tests/conftest.pywith shared synthetic fixtures: labels, valid/invalid.npzfiles, minimalresults.csv, and a baseConfiginstance. - Added
tests_output.txtto.gitignore.
Fixed¶
- Removed redundant
print()progress calls frommain.py; all progress now goes throughlogger.*only. Smoke banner remains asprint()(user-facing UI). - Changed smoke-mode
logger.warning()tologger.info()inmain.pyto avoid spurious output when--verboseis not passed. - Removed
logging.basicConfig(level=logging.INFO)fromload_dataset.py— module-levelbasicConfigwas overriding the package logger configuration. - Improved error message for missing
.npzfile: now includes full expected path and an actionable hint. - Improved error message for missing
Xkey in.npz: now raisesValueErrorwith filename and list of available keys. - Improved label mismatch error: now includes both array shapes and differing element count.
- Added guard in
Finalizer.__init__for missingresults.csv: raisesFileNotFoundErrorwith path and actionable hint before attempting to read. - Bumped version to
0.1.4inversion.pyandCITATION.cff.
Validation¶
pytest tests/ -v— 31 passed, 0 failed.mosaic run --smoke— silent output (smoke banner only, no logger noise).mosaic run --smoke --verbose— clean INFO logs, no duplicates.mosaic export --row 0(missing CSV) — descriptiveFileNotFoundError.
0.1.3 - 2026-05-22¶
Added¶
- Added
pyproject.tomlwithhatchlingbuild backend and[project.scripts]entry point:mosaic = "mosaic.cli:main". Package is now installable viapip install -e .. - Added unified CLI
mosaic/cli.pywith subcommandsmosaic runandmosaic export, replacing the two separate entry points. - Added global CLI flags:
--verbose(INFO-level logging),--config PATH(user TOML override),--version. - Added
mosaic/config_default.tomlwith externalized configuration: paths, reduction types, levels, random state, CV settings, and active models. - Added
Config.setup()method to separate filesystem side effects from object instantiation, enabling safe use in tests. - Added
ResultManager.write_csv()method, consolidating all file I/O underResultManager. - Added
smokecolumn toresults.csvto mark runs generated in smoke mode. - Added smoke-mode export guard:
mosaic exportblocks export of smoke results with exit code 1. Usemosaic export --forceto override with a visible warning. - Added package-level
NullHandlerlogger inmosaic/__init__.py.
Changed¶
Confignow readsconfig_default.tomlas the base configuration.Config.__init__no longer creates directories or sets random seeds.Config.PARAM_GRIDis now built by_build_param_grid().main.pynow iterates overconfig.REDUCTION_TYPESinstead of a hardcoded list.main.pydelegates CSV writing toResultManager.write_csv().- CLI logic centralized in
mosaic/cli.py. - Bumped version to
0.1.3inversion.pyandCITATION.cff.
Validation¶
pip install -e .succeeded inmosaic_env.mosaic --help,mosaic run --help,mosaic export --helpverified.mosaic --versionreturnsMOSAIC 0.1.3.mosaic run --smoke --verbosecompleted full PCA + UMAP run with INFO logging.mosaic export --row 0 --forceexported with warning,.pklartifact created.
0.1.2 - 2026-05-22¶
Changed¶
- Moved all source modules into a
mosaic/package directory. - Updated all intra-package imports to use the
mosaic.*namespace. result_manager.pynow reads__version__frommosaic.version.- Updated
README.mdto reflect themosaic/package structure.
Fixed¶
- Bumped version string in
version.pyto0.1.2.
Added¶
- Added
--smokeflag tomosaic.mainfor lightweight benchmarking. - Added
argparseCLI tomosaic.mainwith--smokeflag and--helpsupport.
Validation¶
- Python syntax validation passed for all modules under
mosaic/. - Dataset loading smoke test passed: PCA70 labels and features loaded correctly.
- SVC, Random Forest and XGBoost smoke tests passed; scores match v0.1.1 baseline.
- PNG figure generation smoke test passed.
0.1.1 - 2025-05-22¶
Changed¶
- Rewrote
README.mdto reflect the current pre-stable repository workflow. - Changed project license from MIT to GNU LGPL v3.0 or later.
- Added GNU license files:
COPYINGandCOPYING.LESSER. - Added SPDX license metadata:
LGPL-3.0-or-later.
Fixed¶
- Added validation to ensure embedded
.npzlabels matchraw/labels.npy. - Ensured plot output directories are created automatically before saving figures.
Added¶
- Added
version.pywith centralized project version metadata. - Added
CITATION.cfffor software citation metadata. - Added non-interactive model export support with
python export_best_model.py --row <index>.
Validation¶
- Python syntax validation passed.
- PCA70 dataset loading passed.
- Export CLI help validation passed.
- Minimal SVC, Random Forest and XGBoost smoke tests passed in
mosaic_env.
0.1.0 - 2025-05-22¶
Added¶
- Initial corrected pre-stable version of MOSAIC.
- Tabular classification benchmarking with PCA/UMAP reduced datasets.
- Grid search support for SVC, Random Forest and XGBoost.
- Repeated Stratified K-Fold evaluation.
- TXT/CSV result export.
- Final model export as
.pkl. - Three-panel metric plotting for F1, Accuracy and AUC-ROC.