RGroupStudio ← Blog

July 2026

How We Verified R-Group Enumeration Against a Real Patent Claim

Chemically valid isn't the same as correct. Here's how we tested the enumeration engine against a real, granted patent claim instead of synthetic examples, and the real gap it surfaced along the way.

Most Markush claims describe a compound genus structurally ("R1 is selected from halo, C1-C6 alkyl, aryl...") without ever spelling out every member. But some claims do something more useful for testing purposes: they include an explicit, exhaustive "selected from the group consisting of" list of specific, named compounds. That's a genuine correctness test. If an enumeration engine can start from just the scaffold and substituent list and reproduce those exact named compounds, that's real evidence it's chemically right, not just that it runs without crashing.

We picked a real one: WO2005011681A1, an SGK-1 inhibitor patent. Claim 40 lists around 40 specific indazolylacrylamide compounds, sharing a (2E)-3-(1H-indazol-3-yl)-2-propenamide core with a substituted phenyl anilide that varies from example to example.

Why this is a harder test than it sounds

Real claim examples don't always pin a substituent to one fixed position the way a simple R1/R2/R3 scaffold does. Across the ~40 named compounds, the phenyl ring's substitution pattern moves around: sometimes one substituent, sometimes three at once, not always at the same ring position. Handling that correctly meant the engine needed to reason about unindexed substituents directly, not just fixed R-group slots, and to correctly recognize when two different-looking placements are actually the same molecule, rather than reporting duplicates.

The results

Using real substituents lifted straight from the claim's own examples (chloro, cyano, methoxy, dimethylamino, and others), we reproduced two of the actual claimed compounds exactly. Canonical SMILES matched byte-for-byte against the real patent structures:

(2E)-N-(3-chlorophenyl)-3-(1H-indazol-3-yl)-2-propenamide
Single-substituent case.
(2E)-3-(1H-indazol-3-yl)-N-(3,4,5-trimethoxyphenyl)-2-propenamide
Three simultaneous substituents on the same ring, correctly identified as one distinct product out of a much larger set of raw candidate placements.

That second case is the one that mattered most. Three substituents landing on a ring with several open positions produces a lot of candidate placements before you account for which of those are chemically identical to each other. Correctly collapsing that down, and landing on exactly the one real claimed compound, is a much stronger signal than a scaffold with a single substituent ever could be.

What it got wrong

We're not going to pretend this test only produced good news, because it didn't, and the failure is more interesting than the success.

Run without extra guidance, the engine doesn't automatically know which ring in a multi-ring scaffold a claim actually intends to vary. None of the ~40 real claimed compounds ever touch the indazole core (it's fixed across the entire claim), but left unconstrained, the engine had no way to know that and proposed substituting it too.

The workaround was pinning the indazole ring down explicitly so the engine only considered the phenyl ring. That works, but it's a workaround, not a fix. Scoping substitution to a specific sub-ring automatically is still an open problem for us, and we're saying so rather than glossing over it.

This is what "verified" means for us: not just "the output is a valid molecule," but "given a real claim's scaffold and substituents, the engine reproduces what that claim actually claims," including being honest about where it still falls short.

RGroup Studio turns a Markush scaffold, drawn, imported, or extracted from pasted patent claim text, into a real, RDKit-validated compound library. There's a free tier if you want to try it on your own claims.

Try RGroup Studio →