Changelog

All notable changes to this project will be documented in this file.

[1.3.5] - 2026-10-27

Added

  • GA Feature Selection Wrapper: Added feature_selection.py under preprocessing, with a wrapper for GeneticAlgorithm() to perform model-driven feature selection on datasets.

  • MLP Multi-Output Support: Added multi-output support to MLP() for regression tasks with multiple targets.

  • Neural Fingerprint Wrapper: Added simplified wrapper function NeuralGraphFingerprint() to allow for instantiation of Neural Graph Fingerprint models with easy-to-tweak parameters.

  • Neural Fingerprint PyTorch Engine: Added PyTorch engine for neural fingerprints as an alternate to TensorFlow.

  • Z-Score Feature Selection: Added ZScoreFSel() in feature_selection.py to remove low z-score binary features during preprocessing.

  • GPU Support (CUDA/ROCm): Added a device option (None/'cpu', 'auto', 'cuda', 'cuda:N') to the PyTorch engines of MLP(), NeuralGraphFingerprint() and ModelScreener().

Changed

  • Python 3.9+ dependency updates: Updated dependencies for higher Python versions to support actively developed package versions.
    • NumPy: Updated codebase to support NumPy 2.x (this also applies to Python 3.8).

    • mordred: Mordred now uses mordred-community package.

    • OpenBabel: Now supporting OpenBabel 3.2.x.

  • Made ChemML installation a one-command job with OpenBabel and PyTorch included in pyproject.toml (NOTE: Python 3.8 still requires separate OpenBabel install, see README.md).

  • Verified Python 3.13 compatibility with all dependencies and CI/CD testing. ChemML with Python 3.13+ is fully SPEC 0 compliant for 2026-2028

  • friedman_mse criterion removed from DecisionTreeRegressor() and RandomForestRegressor() hyperparameter search space as it’s mathematically identical to mean_squared_error and will be removed in future scikit-learn versions.

  • MLPRegressor() n_neurons reduced in AutoML due to MLPRegressor() and MLP() being used separately for small/large datasets.

  • Added demo for classification AutoML workflow in docs/ipython_notebooks/autoML_classification.ipynb.

  • Classification AutoML now includes MLPClassifier from scikit-learn.

  • Neural fingerprints now support multi-output regression and classification tasks, see wrapper function NeuralGraphFingerprint() for details.

  • AutoML now also uses Z-score feature selection for preprocessing, removing low z-score binary features.

Fixed/Miscellaneous

  • Updated CI/CD to reflect one-line installation.

  • Removed correlated feature removal from FOSS descriptor generators, as this functionality is now available in the new feature_selection.py module.

  • AutoML tests now run single-core and multi-core models in separate tests, so it’s easier to test the overall architecture.

  • Removed ‘std’ column from ModelScreener() output, it is not reflective of model performance.

  • Removed Python 2 compatibility layer, as Python 2 is no longer supported by ChemML and all dependencies.

  • Removed TensorFlow transfer learning testing from CI due to stochastic errors causing unpredictable test failures.

  • Fixed issue #23, a possible failure mode in GA.

  • Dragon tests now skip if Dragon is not installed, rather than using -k in the pytest call.

  • Fixed classification AutoML bug where SVC was not being instantiated with probability=True, which is required for ROC curve plotting and AUC calculation.

  • Removed liblinear solver from LogisticRegression hyperparameter search space, as it is not compatible with multi-class classification.

  • Found and fixed a NumPy 2.x issue with complex numbers randomly appearing during feature generation.

  • Tests now make use of pytest parametrization to reduce duplicate tests.

  • All ChemML modules now implement lazy loading for performance improvement, as well as SPEC 1 compliance.

[1.3.4] - 2026-07-28

Added

  • RDKit XYZ Saving: Added XYZ file output support to RDKit Molecule.to_xyz(...) optimizer workflows.

  • Mordred 3D Descriptors: Added 3D descriptor support to Mordred when configured with ignore_3D=False, using ChemML Molecule-based serial 3D optimization followed by parallel Mordred descriptor calculation.

  • Feature Cleaning Refresh: Revised feature cleaning functions to be under feature_cleaning.py under preprocessing, with additional correlated and invariant feature removal tools.

  • Genetic Algorithm Multiprocessing: Added multiprocessing support to GeneticAlgorithm() for faster evaluation of large populations, with optional n_jobs parameter to specify number of parallel processes (default is 1, no parallelization).

  • AutoML Model Saving: Both overall best model and best model per feature are now saved to disk within the output directory, along with other metadata necessary for model replication. Replication example given in docs as well.

Changed

  • Standardized molecule loading for foss_descriptors to avoid redundant code in each descriptor generator.

  • foss_descriptors and feature_cleaning use lazy loading of modules throughout (SPEC 1 compliant).

  • ConstantColumns() now uses the RemoveInvFeatures() function as the true backend, and will be removed in v1.4.

  • Added target_features_count and active_fraction parameters to GeneticAlgorithm() to allow for direct specification of the number of features to select/ratio of features to preserve, rather than previous random choice that always preserved about half of features.

  • AutoML now uses eigen spectrum-based Coulomb matrix instead of sorted; this is a more robust representation that avoids degeneracy issues with sorted Coulomb matrices.

  • AutoML now accepts an output_dir parameter due to increased output files and directories being generated, including best model artifacts.

Fixed/Miscellaneous

  • Some minor code comment updates.

  • Updated documentation and tests for new/changed features.

Notes

  • Support Status: ChemML v1.3.5 will be the last release to support Python 3.8-3.12 as they are EoL. Future releases (v1.4+) will require an update to Python 3.13+ in accordance with SPEC 0. Note that 1.3.5 and 1.4.0 will be equally capable, and this is being done to streamline future development and maintenance.

[1.3.3] - 2026-04-22

Added

  • LightGBM Integration: Added LightGBM algorithm support to the model screener functionality

  • Classifier AutoML: Completed classifier AutoML capabilities for expanded model screening

  • Pradhan et al. 2026: Added reproducible workflow and datasets for the Inverse Design paper by Pradhan et al. 2026

Changed

  • RDKit Fingerprints: Upgraded the RDKFP implementation to utilize RDKit’s modern rdFingerprintGenerator set of fingerprint generators

  • Descriptor Calculation Logic: AutoML’s RDKit descriptor calculation now relies on RDKDesc() wrapper class in FOSS descriptor module

  • FOSS Descriptors/Tests: Modified FOSS descriptors functionality logic and expanded related tests

  • Documentation Setup: Transitioned the repository’s Markdown changelog into docs/changelog.rst to support unified ReadTheDocs rendering, and updated the main index accordingly

  • Tutorial Notebooks: Updated feature representation documentation and notebooks corresponding to new RDKFP code outputs

  • Progress Tracking via tqdm: Implemented a progress bar for RDKit descriptor calculations and genetic algorithm using tqdm

Fixed/Miscellaneous

  • Modernized Packaging: Added pyproject.toml for standard PEP 517/518 builds, eliminating setup.py and –use-pep517 flag during install

  • Pandas 3.0 Compatibility: Fixed some incompatibilities with pandas 3.0 found in CI/CD testing; in theory this should make ChemML compatible with pandas 3.0, but further testing is needed

  • TensorFlow 2.x Compatibility: Patched backwards compatibility errors in Neural Fingerprint graph convolutional layers

  • Python 3.8 Support: Ensured dependencies, test module configurations, and setups maintain Python 3.8 backwards compatibility

  • Documentation: Updated documentation index page to keep up-to-date with README.md

Commits Included:

  1. 5eb23ef - updating feature rep docs with new RDKFP code

  2. 6e3fe21 - patching TF2.x error in neural fingerprints

  3. c5dc859 - updating RTD page, moving changelog to docs

  4. e725bed - Updating RDKFP to use modern rdFingerprintGenerator

  5. 8e6d60c - Adding LightGBM to modelscreener

  6. 2ae5a02 - Using foss_descriptors’s RDKit descriptor function

  7. 28ee6bd - adding progress bar for rdkit descriptor calculation

  8. 85bc354 - completing classifier AutoML

  9. 0c4782f - Confirming pip install fix (closed pyproject.toml dev)

  10. a526f01 - fixing pandas 3.0 issues on CI/CD

  11. 6bf11de - Modifying foss descriptors and tests

  12. 8ca2e1f - adding pyproject.toml and 3.8 backwards compatibility

  13. 35fe0cf - patched CI/CD to fix nitinmad issue

  14. 6205026 - Updated the GeneticAlgorithm to be abel view as progress bar using tqdm

  15. 368d2ec - Added tqdm

  16. fcca36b - Add reproducible workflow and datasets for Pradhan et al. 2026 Inverse Design paper

[1.3.2] - 2025-12-05

Added

  • MLP Model Enhancement: Added get_params() method to the MLP class for scikit-learn compatibility with model screening tools

  • GitHub Actions Workflow: Created comprehensive CI/CD pipeline (test.yml) for cross-platform testing on Ubuntu, macOS, and Windows with native coverage reporting

  • Mixed Precision Workaround: Added mixed precision policy initialization in LorentzLorenz to prevent ml_dtypes.float4_e2m1fn compatibility errors with TensorFlow 2.19+

  • Keras 3 Compatibility: Updated Adam optimizer imports and instantiations to use Keras 3 standard (removed deprecated .legacy module and decay parameter)

  • Dictionary-based Metrics: Implemented Keras 3-compliant multi-output model metrics using output name mapping to prevent duplicate metric naming errors

  • GitHub Native Coverage Reporting: Added artifact uploads for coverage XML reports from each test run on different platforms

  • GitHub Actions Badge: Added workflow status badge to README for visibility into test status

Changed

  • Loss Specification: Updated LorentzLorenz model compilation to use list of losses for each output instead of single loss string, matching Keras 3 requirements

  • Metrics Configuration: Changed from list-based metrics to dictionary-based metrics for multi-output models to ensure unique metric names in Keras 3

  • AutoML Multi-core Support: Enhanced model_screener.py with improved multi-core processing capabilities

  • Model Screener: Updated test_hyp() compatibility for better parameter tracking and reporting

  • CI/CD Infrastructure: Migrated from Travis CI to GitHub Actions with improved coverage reporting

  • Version Tracking: Updated README to reference GitHub releases instead of PyPI for latest version

  • Version Number: Bumped to 1.3.2 to reflect Keras 3 compatibility and infrastructure improvements

Removed

  • Travis CI Configuration: Removed outdated .travis.yml file (superseded by GitHub Actions)

  • Codecov Integration: Removed external Codecov service dependency in favor of GitHub-native coverage artifact uploads

  • PyPI Badge: Replaced with GitHub releases badge as repo is ahead of PyPI

Fixed

  • Keras 3/TensorFlow 2.19 Compatibility: Fixed “Found two metrics with the same name” error by implementing proper output naming and dictionary-based metrics

  • Adam Optimizer: Removed incompatible decay parameter for Keras 3 Adam optimizer initialization

  • Mixed Precision Issues: Resolved ml_dtypes.float4_e2m1fn AttributeError by setting global mixed precision policy to float32

  • PyTorch Installation: Added OS-specific PyTorch installation in GitHub Actions workflow

  • OpenBabel Import: Fixed openbabel import failures in GitHub Actions by adding openbabel-wheel pip installation alongside conda installation

Technical Details

Commits Included:

  1. b83abd9 - patch to published models - Added get_params() method to MLP class - Fixed LorentzLorenz model metrics for Keras 3 compatibility - Updated notebook documentation

  2. dba73a6 - backwards compatibility fixes - Updated Adam optimizer imports (removed .legacy) - Fixed mixed precision initialization in LorentzLorenz - Updated test imports for consistency

  3. 5739610 - AutoML multi-core update - Enhanced model_screener.py with improved parallelization - Updated space.py for better genetic algorithm integration - Modified MLP to support model screening via get_params() - Updated test cases for AutoML screening

  4. 8bbe071 - Updated readme and setup for local install - Updated README installation instructions - Modified setup.py for Python 3.12 compatibility

  5. d167ce8 - code CI/CD updated to GitHub Actions - Migrated from Travis CI to GitHub Actions workflow - Added .github/workflows/test.yml for cross-platform testing - Configured conda-forge dependencies with Mambaforge - Added OS-specific PyTorch installation for CI environments

  6. 400b260 - CI/CD patches - Added pytest and coverage configuration - Skipped test_Dragon in CI due to software availability - Configured matplotlib backend for CI environments - Added coverage XML artifact uploads

  7. 29e3715 - macOS CI/CD patch for tkinter - Added tk to conda-forge dependencies for macOS compatibility - Enhanced matplotlib configuration for non-GUI backend - Added MPLBACKEND environment variable for CI

  8. 5571532 - removing extra import to avoid CI/CD issues - Removed unused from turtle import back import from explain.py - Fixed ModuleNotFoundError for _tkinter on macOS CI

Dependencies Updated

  • TensorFlow/Keras: Now compatible with Keras 3 and TensorFlow 2.19+

  • PyTorch: Added proper CPU-only installation for CI environments

  • System Libraries: Added openbabel-wheel for proper pip installation alongside conda openbabel

Testing

  • All tests pass on Ubuntu, macOS, and Windows with Python 3.12

  • Cross-platform CI validation implemented via GitHub Actions

  • Coverage reporting integrated with Codecov

Migration Guide for Users

If you’re upgrading from the previous version, note these breaking changes:

  1. Adam Optimizer Parameters: The decay parameter is no longer supported in Adam. Use learning_rate scheduling instead.

  2. Keras 3 Models: Multi-output models now require dictionary-based metrics configuration:

    metrics_dict = {
        'output_name': ['metric1', 'metric2'],
        ...
    }
    model.compile(metrics=metrics_dict)
    
  3. Mixed Precision: Mixed precision is now disabled by default to ensure compatibility. Enable it explicitly if needed.

—

For more information on each change, see the individual commit messages or the pull request discussions.