Canonical tautomer generation is implemented differently in RDKit and ChemAxon. The RDKit implementation closely replicates the MolVS enumeration and canonicalization process. The process involves 1) enumerating all possible tautomers using a set of transform rules and 2) selecting a canonical tautomer based on a scoring system (Tautomer Transforms & Scores). Each transformation rule is specified by a SMARTS pattern, where a hydrogen shifts from the first to the last atom in the pattern. To account for this hydrogen shift, single and double bonds along the pattern are adjusted accordingly.