60 Commits

Author SHA1 Message Date
Rody Arantes
5d9892575c Fix STEREOANY (wavy bond) loss during InChI roundtrip (#9315)
When converting molecules with wavy bonds (Bond::STEREOANY on double
bonds) through InChI and back, the stereo information was silently
dropped. This affected any workflow using InChI roundtrips for
canonicalization (e.g. with -SUU flag).

Two bugs in External/INCHI-API/inchi.cpp:

Reverse path (InchiToMol): The stereo0D processing loop skipped
INCHI_PARITY_UNDEFINED entries before they could reach the double bond
handler. The handler already had an else clause that correctly sets
Bond::STEREOANY, but it was never reached. Fix: only skip
INCHI_PARITY_NONE at the top level, and add a guard in the Tetrahedral
case to prevent UNDEFINED/UNKNOWN from incorrectly setting chirality.

Forward path (MolToInchi): STEREOANY double bonds were only handled by
collapsing the coordinates — InChI then produced no stereo annotation
under -SUU. Fix: also emit a stereo0D entry with INCHI_PARITY_UNKNOWN
parity so InChI's -SUU output correctly carries the "stereo unknown"
designation. StereoAtoms may be cleared for STEREOANY, so we locate
the two outer neighbors by iterating bonds.

New test testStereoAnyRoundtrip in External/INCHI-API/test.cpp covers
9 representative cases (Schiff base, oxime, cinnamic acid, chalcone,
crotonaldehyde, tamoxifen-like, retinal-like, plus two molecules with
a chiral center adjacent to the wavy bond).

Counts in rdkit/Chem/UnitTestInchi.py shift by 1 (689 same, 492
reasonable) because the new STEREOANY emission produces a more
accurate roundtrip for one entry in the test inventory.

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-06-02 14:41:00 +02:00
Greg Landrum
e35f7db009 Cleanup/get atoms and bonds (#9243) 2026-04-18 05:22:09 +02:00
Yakov Pechersky
87a6c7163d Use index-order kekulization in MolToInchi (#9226)
MolToInchi has called MolOps::Kekulize(*m, false) for years, but PR #9125 changed the default traversal to canonical=true. That pulls rankFragmentAtoms() and the canonicalization path into the InChI conversion even though the tested InChI outputs stay the same.

Validation:
- rdkit.Chem.UnitTestInchi passed before and after this change on upstream/master (18 tests, OK in both runs).
- No InChI output drift was observed between stock and patched builds on Regress/Data/mols.1000.sdf.gz, rdkit/Chem/test_data/pubchem-hard-set.sdf.gz, or the atom-order regression molecules added in Code/GraphMol/catch_graphmol.cpp.

Performance:
- Release_2026_03_1 Python MolToInchi on Regress/Data/mols.1000.sdf.gz improved from 0.40712s to 0.38871s median (-4.52%).
- Release_2026_03_1 rdinchi MolToInchi on the same dataset improved from 0.39755s to 0.37814s median (-4.88%).
- Release_2026_03_1 standalone C++ MolToInchi on /tmp/mols.1000.sdf improved from 7.66775s to 7.03474s wall time (-8.26%), from 20.57B to 19.04B cycles (-7.46%), and from 121.78M to 114.05M cache misses (-6.35%).
2026-04-07 06:17:40 +02:00
Greg Landrum
7467fe005f Fixes #8508 (#8514)
* Fixes #8508

* suggestion from review

* Update inchi.cpp
2025-05-11 05:10:18 +02:00
Ricardo Rodriguez
55dc5c73e3 fix inchi conversion leak 1 (#8291) 2025-02-24 17:14:38 +01:00
Ricardo Rodriguez
1a67fefcc6 mem fixes (#8276) 2025-02-20 05:59:30 +01:00
Yakov Pechersky
b9f7d4787b When ignoring tetrahedral chirality for inchi, case on degree, not valence (#8266)
Fixes #8238
Fixes #8239
Modification of #8126
2025-02-13 19:14:57 +01:00
Greg Landrum
fa048eacc5 Replace GetImplicitValence() and GetExplicitValence() with GetValence() (#7926) 2025-01-28 21:09:03 +01:00
Greg Landrum
e6a45a8d17 Fixes two out-of-bounds bugs in the InChI wrapper (#8126) 2024-12-25 21:32:35 +01:00
Ricardo Rodriguez
ea7f51f3b1 Fix some mem errors in 2024.09.1 (#7867) 2024-10-03 16:05:43 +02:00
Greg Landrum
da6cd73168 Run clang-format across everything (#7849)
* run clang-format-18 across Code/*.cpp and Code/*.h

* run clang-format-18 across External
2024-09-26 13:39:02 +02:00
Greg Landrum
31f11952e0 Fix #7311: problem with InChI for phosphinic acid (#7419)
* backup

* remove default valence for Tl
2024-05-03 21:23:37 +02:00
Ric
aa02c9afb0 Fixes #6633 (#6643)
* add a test

* add fix

* ignore incorrect stereo bonds from inchi
2023-08-23 06:18:14 +02:00
Greg Landrum
41d0139c4b Fixes #6172 (#6388) 2023-05-23 16:09:52 +02:00
Greg Landrum
e322928028 swap boost::tuple to std::tuple (#5851) 2022-12-16 16:01:19 +01:00
Ric
76e8b2a3f3 fix + test (#5057) 2022-03-05 04:32:31 +01:00
Greg Landrum
06027dcd05 Remove unnecessary mutex in InChI wrapper (#4680)
* External/INCHI-API: drop unnecessary mutex

A mutex was introduced in 6cfd34 from 2012 around all InChI library
calls, and InChI v1.05 release notes from 2017 announce that they fixed
race conditions to support multithreading.

We find that the InChI library mutex is no longer necessary with v1.05
and this patch removes it, which enables rdkit users to concurrently
call InChI-related methods.

This patch also updates the InChI multithreading tests to cover
`MolBlockToInchi`, so we have test coverage of concurrently making all
InChI calls.

I ran `testInchi` under asan 200x and all runs passed cleanly.  I was
unable to configure the build toolchain with msan or tsan, so it is
unclear to me if those sanitizers would flag any issues.

* External/INCHI-API: add second multithreading test

This test covers case where immediate concurrent usage of the InChI
library leads to memory corruption.

* remove ASAN workaround (not needed for InChI 1.06)
clang-format run
update inchi version to 1.06 in docs

Co-authored-by: Jin Pan <jinxp1@gmail.com>
2021-11-10 04:08:30 +01:00
Paolo Tosco
3904b6958d Fixes RDK_BUILD_THREADSAFE_SSS=OFF build (#4349)
* - fix non-threaded *nix builds that currently fail because
  boost flyweight introduces a dependency on pthreads
- make sure that mutexes and futures are only used when
  RDK_BUILD_THREADSAFE_SSS is ON
- fix SubstructMatch failing test when RDK_BUILD_THREADSAFE_SSS is OFF
  due to misplaced #ifdef's
- rename RDK_TEST_MULTITHREADED to RDK_THREADSAFE_SSS in inchi.cpp
  (which is not a test)

* - the limitexternal Linux build is now single-threaded so we make
  sure single-threaded builds do not break in the future
  (suggestion from Greg)

* reverted unnecessary change to Code/GraphMol/FileParsers/testMultithreadedMolSupplier.cpp

Co-authored-by: Paolo Tosco <paolo.tosco@novartis.com>
2021-07-23 14:25:25 +02:00
Greg Landrum
0e89b2dbea cleanup a bunch of compiler warnings (#3849)
* cleanup a bunch of g++ warnings

* make it work with clang

* remove some additional warnings based on CI builds

* fix that version number

* stop being verbose when building
2021-02-26 05:10:02 +01:00
Ric
703fe5a225 Remove boost::foreach from public headers (#3820)
* remove include from headers

* update implementation files

* completely remove BOOST_FOREACH (#7)

* convert those changes to use auto

* get rid of all usage of BOOST_FOREACH

Co-authored-by: Greg Landrum <greg.landrum@gmail.com>
2021-02-17 14:15:48 +01:00
Greg Landrum
454abb257c A couple of InChI bug fixes (#3656)
Fixes #3645
Fixes #3655
2020-12-17 09:32:51 -05:00
Greg Landrum
a7c438f870 Fixes #3646 (#3653) 2020-12-17 08:34:15 -05:00
Greg Landrum
c259a81e01 Fix #3365 (#3366)
* Fixes #3365

* update expected inchi results

Note that this actually increases the number of failures with one of the tests.
That's because I believe the expected InChIs to be wrong and these new results to be correct.
2020-08-26 19:10:15 -04:00
Greg Landrum
45b9aef28b clang-tidy modernize-use-default-member-init and modernize-use-emplace (#3190)
* run clang-tidy with modernize-use-default-member-init

* results from modernize-use-emplace

* one uniform initialization per line
otherwise SWIG is unhappy

Co-authored-by: Brian Kelley <fustigator@gmail.com>
2020-05-28 09:07:58 +02:00
Greg Landrum
d41752d558 run clang-tidy with readability-braces-around-statements (#2899)
* run clang-tidy with readability-braces-around-statements
clang-format the results
clean up all the parts that clang-tidy-8 broke

* fix problem on windows
2020-01-25 14:19:32 +01:00
Eisuke Kawashima
5cd27a242f Fix typo (#2862)
* Fix typo

* Reflect the comments

* Fix more typos
2019-12-31 06:43:27 +01:00
Greg Landrum
ec31bea97b clang-tidy-7 pass (#2408) 2019-04-16 12:05:47 -04:00
Greg Landrum
bebf0c9002 Allow converting mol blocks directly to InChI (#2262)
* basics of enabling molblock -> InChI

* first pass at python wrapper

* test that options work
2019-02-13 09:43:02 -05:00
Greg Landrum
108d84ab1e Switch from boost::thread to std::thread (#1745)
* boost::thread mostly gone... still need to get rid of once
everything compiles

* replace boost::call_once

* remove link-time dependency on boost::thread

* first pass at using async

* switch to using async everywhere
2018-02-22 03:43:07 +01:00
Greg Landrum
4160d20fdc Fixes github #1572 (#1573)
* Fixes #1572
initial pass

* one more cleanup; adjust expected results for the python unit tets
2017-09-15 12:59:26 -04:00
Greg Landrum
e52cf5c666 Fix/github1286 (#1307)
* clean up the header a bit
clang-format

* clang-format

* add test for #1286

* backup

* fixes the specific failure, but needs more looking

* add an additional test

* update the inchi code to explicitly include queue

* fix a typo identified during the review
2017-03-04 12:35:26 -05:00
Greg Landrum
e625c58bab Add cis/trans tags to double bonds (#1316)
* add cis and trans to bond stereo

* compiles, does not work

* tests all pass

* Whitespace cleanup to recent changes.

* C++ test case for Bond::setStereo using Bond::STEREOCIS and Bond::STEREOTRANS

* Adding a PRECONDITION to Bond::setStereo to make sure the stereo atoms
are already specified if CIS or TRANS is being specified.

E/Z is technically defined by the topology of the molecule so the
stereo atoms are redundant (easier to understand and use!), but
ultimately redundant with the graph. However, CIS and TRANS is _only_
defined in this usage as the orientation of the atoms in the
getStereoAtoms vector.

* Exposing Bond::setStereo to Python and adding test cases to make sure
it can be used to set CIS/TRANS stereochemistry.

* verify substructure matching works

* Adding Bond::setStereoAtoms to C++ Bond class.

This allows setting the atoms to be considered for CIS or TRANS
directly without a much more costly determination of ranking that E/Z
requires.

* Wrap Bond::SetStereoAtoms into python with a new type of test case.

* docs
2017-02-26 08:15:44 -05:00
Greg Landrum
03cd55e635 Dev/cleanup warnings (#948)
* Remove a bunch of warnings

The biggest change here is to treat the boost includes as system libraries.
This causes g++ to ignore warnings from boost.
This change still needs to be tested with clang and on Windows

* suppress a bunch of warnings on clang
2016-06-22 13:49:15 -04:00
Greg Landrum
ccbebcf3ba and another block of warnings 2016-03-30 14:03:54 +02:00
Greg Landrum
e04aed8ea8 another batch of warnings squashed 2016-03-30 13:44:21 +02:00
Greg Landrum
954411f9ea Fixes #614 2015-09-20 04:26:08 +02:00
Greg Landrum
3937182db7 Fixes #562 2015-08-13 13:54:23 +02:00
Nadine Schneider
5d963846b8 merge 2015-04-10 09:44:18 +02:00
Greg Landrum
433a6230cd remove unneccesary call to assignStereochemistry() 2015-02-20 07:31:32 +01:00
Greg Landrum
ca0c495676 this is the fix for #437
inchi tests now pass, the rest still need to be checked
2015-02-20 06:27:13 +01:00
Greg Landrum
326fdc0463 Merge remote-tracking branch 'origin/master' into NewCanonicalization_24July2014 2014-08-21 05:08:56 +02:00
Greg Landrum
170205afe5 Fixes #296 2014-08-14 05:38:17 +02:00
Greg Landrum
1bc77d9475 get these building again 2014-07-29 04:47:25 +02:00
Greg Landrum
937ee9f60a add in-place form of removeHs() 2013-10-04 07:19:01 +02:00
Greg Landrum
246e300784 Fixes #68
Note that the molecules that are produced are still definitely
  not chemically sensible, but the InChI processing at least
  no longer hangs
2013-08-09 05:50:39 +02:00
Greg Landrum
0407268aa8 Fixes #67
this stereochemistry case is not correctly handled, but at least it
no longer generates a seg fault
2013-07-21 17:51:44 -04:00
Greg Landrum
f97705c7f2 Fixes #40 2013-06-07 06:59:04 +02:00
Greg Landrum
d7d78f929a cleanups from Fedora review 2013-06-02 15:41:00 +02:00
Greg Landrum
b495babb97 fix problem caused by github-8 fix 2013-03-14 06:24:29 +00:00
Greg Landrum
085ff8c96f get this working for molecules that have not be sanitized too 2013-02-14 04:07:48 +00:00