Skip to content

SMSD Pro 8.1.0

Choose a tag to compare

@asad asad released this 31 Oct 18:14
· 12 commits to master since this release

SMSD Pro 8.1.0

Exact substructure, maximum common substructure and similarity search, now
ready for data science, AI assistants and large compound
libraries.

About the PyPI files. The 8.1.0 files on PyPI were uploaded manually and
carry no provenance attestation. Their SHA-256 checksums match this release's
SHA256SUMS. From 8.2.0, releases are published through trusted publishing.

What is new

  • Works with your data tools. Fingerprints go straight into NumPy, pandas,
    Arrow, Polars, scikit-learn and PyTorch, with scikit-learn transformers for
    pipelines.
  • Chemistry tools for AI assistants. A local MCP server offers eight
    molecular tools, from MCS and substructure search to screening and
    depiction. Everything runs on your machine.
  • Built for large libraries. Memory-mapped fingerprint corpora support
    threshold and exact top-k search, Butina clustering and MaxMin selection,
    on the CPU or an NVIDIA GPU with the same results.
  • Results you can trust. Every substructure and MCS search reports whether
    it completed and whether its answer is proved optimal.

Try it

python -m pip install "smsd==8.1.0"
import smsd

mcs = smsd.MCS.find("CC(=O)Oc1ccccc1C(=O)O").match("OC(=O)c1ccccc1O")
print(mcs.matches[0].atom_count, mcs.optimal)  # 10 True

Learn more

If SMSD Pro helps your work, a star on GitHub and a
citation help other
chemists find it.


Summary

SMSD Pro 8.1.0 adds Python data and machine-learning adapters, local MCP tools,
packed fingerprint corpora, corpus threshold searches and SMARTS export of MCS
results, and corrects the C++ RDKit adapter. The deprecated 8.x APIs remain
available and supported throughout the 8.x line. The Java library and
command-line tool stay at 8.0.3 on Maven Central. The CPU Docker images carry
the 8.1.0 command-line tool; otherwise the Java changes below are available
only from a source build. The changelog lists every change.

Changes

  • Python adapters give fingerprints as NumPy, PyTorch,
    SciPy CSR, Arrow, pandas and Polars data, add scikit-learn fingerprint and
    similarity transformers, and build PyTorch Geometric graphs with native atom
    numbering and no coordinates or stereo. The PyTorch adapters refuse a
    conflicting bundled OpenMP runtime; use a shared runtime or build SMSD with
    SMSD_BUILD_OPENMP=OFF.
  • smsd-mcp serves eight local molecular tools over MCP for
    MCS, substructure and SMARTS search, fingerprints, similarity, screening,
    standardisation and depiction; the registry also exports function definitions
    and optional LangChain and LlamaIndex tools. Results are JSON with search
    status and limits; no tool contacts a model provider.
  • A consolidated API reference, an llms.txt index and a
    guide to connecting AI assistants make the interfaces and
    local tools easier to find. New Python examples cover NVIDIA screening checked
    against the CPU, an offline chain of the molecular tools and an MCP client.
  • The MCP container recipe and
    Hugging Face demonstration source use
    supplied wheelhouses. They are source examples, not deployed services or
    published images. Native SVG helpers highlight existing MCS results.
  • Packed fingerprint corpora are read-only memory-mapped
    files for threshold and exact top-k scans, Butina clustering and MaxMin
    selection. The CPU is the default; backend="cuda" computes exact integer
    intersections on the GPU, and "auto" does so when a supported GPU is
    available. Clustering decisions stay on the CPU, and cuda_calls counts
    completed CUDA calls. All-pairs work is quadratic.
  • smsd-cuda adds smsd_cuda.preload(),
    retained device workspaces for prepared corpora, opt-in CUDA Graph replay
    (SMSD_CUDA_GRAPHS=1) and on-device top-k selection.
  • stream_screen_smiles and stream_screen_many_smiles screen target iterables
    in bounded chunks, and warm_start prepares a corpus and returns a first
    screen, with the usual TargetCorpus GPU dispatch and CPU fallback.
  • Substructure.match_corpus and MCS.match_corpus (C++ matchCorpus) decide,
    in target order, whether each target contains the query or shares at least a
    given number of atoms; a stopped search leaves the answer open. Matching runs
    on the CPU; gpu_prefilter=True lets an available GPU pre-screen targets.
  • SMARTS export writes MCS matches in C++, Java and Python;
    matchWithSmarts (Python match_with_smarts) returns the result and SMARTS
    together, and Java SmartsWriter writes whole graphs. Stereo, tautomer,
    complete-ring and strict ring-fusion options are rejected. A pattern carries
    neither the induced MCIS objective nor the search status.
  • Relevant cycles can be counted without listing them:
    computeRelevantCycleFamilies (Python compute_relevant_cycle_families)
    groups them into families, each with one member and its exact number of
    members, and two further functions find the family of a ring or list members
    up to a given limit. The grouping into families can depend on the input atom
    order.
  • The C++ RDKit adapter (fromRDKit, fromSmiles) keeps each atom's hydrogen
    count and specified double-bond E/Z configuration. Aromatic N–H atoms, as in
    pyrrole, previously lost their hydrogen.
  • SMILES writers and the C++ and Python SMARTS writer reuse ring-closure
    numbers and raise an error beyond 99 open closures; SMILES writers also
    write long chains without exhausting the stack. Compiled SMARTS evaluate
    distinct recursive predicates separately, and bond edits refresh cached rings
    and topology. Worker errors in TargetCorpus.prewarm, CPU corpus screening,
    C++ path-fingerprint batchFingerprint and batchFingerprintScreen now reach
    the caller instead of ending the process.
  • Conda recipes build the CPU package and the Linux CUDA package; the
    conda guide gives the conda, mamba and Pixi
    install routes.
  • NOTICE now carries licence notices for the RDKit MACCS key definitions and
    pybind11. The smsd-cuda package now ships the CUB and CCCL licences, and its
    NOTICE points to them.

Upgrading from 8.0.3

SMSD Pro 8.1.0 supports CPython 3.12–3.15. On Python 3.10 and 3.11, pip
continues to install 8.0.3.

Ring perception works within one fixed, deterministic work limit, the same in
C++, Java and Python and independent of time, thread count and hardware. Very
large fused-ring systems, such as synthetic cages, can reach it. Some ring
systems that 8.0.3 left incomplete now complete, and their ring-dependent
results can change. Where rings stay incomplete, values computed
without the missing rings stay exact; where 8.0.3 computed the rest from
incomplete rings, searches now report LimitReached and other calls raise an
error naming the cause, with the zero-based input index in C++ and Python batch
calls. That error is the new RingBasisUnavailable (Java
RingBasisUnavailableException), which existing std::runtime_error,
RuntimeError and IllegalStateException handlers still catch. A longer
timeout does not change this; see
Results and budgets.

Complete-ring matching uses all relevant cycles, and the new
relevantCyclesTruncated (Python relevant_cycles_truncated) reports when their
enumeration is incomplete. A relevant cycle outside the smallest set of smallest
rings now counts as a complete ring, so a completeRingsOnly result that 8.0.3
reported as proved, sometimes empty, can now be larger. With completeRingsOnly,
Java substructure matching now rejects matches that cover only part of a ring,
as C++ and Python do. ringsTruncated keeps its meaning. Per-atom ring counts,
and with them strict ring-fusion results, can differ from 8.0.3.

SMARTS R<n> (n > 0) uses the same minimum cycle basis in C++ and Java. If
ring perception cannot complete it, an R<n> search that cannot be decided
without it returns LimitReached without matches, which does not prove
absence; other functions that need the basis raise an error, and computeSSSR
and computeRings may return incomplete rings with truncation flags. R and
R0 are unaffected. Ring-size and double-bond stereo fingerprint terms,
aromatic-ring keys (as in MACCS) and SMARTS keys whose search needs the basis
also raise an error then. Java now uses the same basis as C++ and Python for
R<n> and these terms, so a Java result from a different minimum basis of
equal size can change.

SMARTS parsing in C++ and Python now rejects a pattern ending in a bond, such
as CC-, as Java already did; 8.0.3 C++ and Python accepted it after dropping
the bond.

C++ and Python MCIS search (the default MCS objective) has changed: when 8.0.3
or 8.1.0 stops a search at its node or time limit, including the default time
limit, the two results can differ, and a result of the same size can come with
a different atom mapping. Java does not have this change, so a stopped search
can return a different result in Java than in C++ and Python.

MCS.consensus always reports optimal as false; complete means the
computation finished, not that no larger common graph exists. Searches on
graphs from the C++ RDKit adapter can now differ. MCS searches reject graphs
with inconsistent bond properties.

Downloads

SMSD Pro 8.1.0 is available from PyPI and GitHub. Install it
with python -m pip install "smsd==8.1.0", adding "smsd-cuda==8.1.0"
(matching smsd) for GPU screening on Linux x86_64 with an NVIDIA GPU. Python
wheels cover CPython 3.12–3.15 on Linux x86_64 and aarch64, Windows x86_64 and
macOS arm64 (macOS 14 or later). For Java, use 8.0.3: the library
com.bioinceptionlabs:smsd:8.0.3 and the command-line tool
com.bioinceptionlabs:smsd-cli:8.0.3 on Maven Central, and the CLI files and
installers of the 8.0.3 release.
The CPU Docker images below carry the 8.1.0 command-line tool. Multi-GPU
screening and native Windows CUDA wheels are not provided. See the
installation guide for requirements, its
Docker section for the Docker images and the
GitHub releases page for the files and
SHA256SUMS:

File Contents
smsd-8.1.0.tar.gz Python source distribution
smsd-8.1.0-cp312-cp312-*.whl to smsd-8.1.0-cp315-cp315-*.whl Python CPU wheels, one per CPython version on each platform: Linux x86_64 (manylinux_2_27_x86_64.manylinux_2_28_x86_64), Linux aarch64 (manylinux_2_26_aarch64.manylinux_2_28_aarch64), macOS arm64 (macosx_14_0_arm64) and Windows x86_64 (win_amd64)
smsd_cuda-8.1.0-py3-none-manylinux_2_34_x86_64.whl Optional CUDA package for Linux x86_64
smsd-cpp-8.1.0-headers.tar.gz Header-only C++17 library
smsd-8.1.0-cpu-linux-amd64.tar.xz and smsd-8.1.0-cpu-linux-arm64.tar.xz Docker CPU images for Linux amd64 and arm64 with smsd and the 8.1.0 Java command-line tool
smsd-8.1.0-cuda-linux-amd64.tar.xz Docker GPU image for Linux amd64 with smsd-cuda and the CUDA runtime
SOURCE_MANIFEST.json, WHEEL_MANIFEST.json and CUDA_WHEEL_MANIFEST.json Source commit and checksums of the source distribution and wheels
RELEASE_NOTES.md These release notes
SHA256SUMS SHA-256 checksums of the release files