Repository navigation
SMSD Pro 8.1.0
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 TrueLearn more
- Documentation and user guide
- Notebooks, each
one click from Google Colab - Clustering on the CPU or GPU,
machine learning and
tools for AI assistants
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-mcpserves 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.txtindex 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, andcuda_callscounts
completed CUDA calls. All-pairs work is quadratic. smsd-cudaaddssmsd_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_smilesandstream_screen_many_smilesscreen target iterables
in bounded chunks, andwarm_startprepares a corpus and returns a first
screen, with the usualTargetCorpusGPU dispatch and CPU fallback.Substructure.match_corpusandMCS.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=Truelets an available GPU pre-screen targets.- SMARTS export writes MCS matches in C++, Java and Python;
matchWithSmarts(Pythonmatch_with_smarts) returns the result and SMARTS
together, and JavaSmartsWriterwrites 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(Pythoncompute_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 inTargetCorpus.prewarm, CPU corpus screening,
C++ path-fingerprintbatchFingerprintandbatchFingerprintScreennow 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. Thesmsd-cudapackage 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 |