from typing import Any, ClassVar

AtomIndexLabels: RGroupLabels
AtomMap: RGroupLabelling
AtomMapLabels: RGroupLabels
AutoDetect: RGroupLabels
DummyAtomLabels: RGroupLabels
Exhaustive: RGroupMatching
FingerprintVariance: RGroupScore
GA: RGroupMatching
Greedy: RGroupMatching
GreedyChunks: RGroupMatching
Isotope: RGroupLabelling
IsotopeLabels: RGroupLabels
MCS: RGroupCoreAlignment
MDLRGroup: RGroupLabelling
MDLRGroupLabels: RGroupLabels
Match: RGroupScore
NoAlignment: RGroupCoreAlignment
NoSymmetrization: RGroupMatching
# None: RGroupCoreAlignment
RelabelDuplicateLabels: RGroupLabels

class RGroupCoreAlignment:
    MCS: ClassVar[RGroupCoreAlignment] = ...
    NoAlignment: ClassVar[RGroupCoreAlignment] = ...
    # None: ClassVar[RGroupCoreAlignment] = ...
    names: ClassVar[dict] = ...
    values: ClassVar[dict] = ...
    __slots__: ClassVar[tuple] = ...

class RGroupDecomposition:
    __instance_size__: ClassVar[int] = ...
    @classmethod
    def __init__(cls, *args, **kwargs) -> None: ...
    @classmethod
    def Add(cls, *args, **kwargs) -> Any: ...
    @classmethod
    def GetRGroupLabels(cls, RDKit) -> Any: ...
    @classmethod
    def GetRGroupsAsColumns(cls, RDKit) -> Any: ...
    @classmethod
    def GetRGroupsAsRows(cls, RDKit) -> Any: ...
    @classmethod
    def Process(cls, RDKit) -> Any: ...
    @classmethod
    def ProcessAndScore(cls, RDKit) -> Any: ...
    @classmethod
    def __reduce__(cls) -> Any: ...

class RGroupDecompositionParameters:
    __instance_size__: ClassVar[int] = ...
    alignment: Any
    allowNonTerminalRGroups: Any
    chunkSize: Any
    gaMaximumOperations: Any
    gaNumberOperationsWithoutImprovement: Any
    gaNumberRuns: Any
    gaParallelRuns: Any
    gaPopulationSize: Any
    gaRandomSeed: Any
    labels: Any
    matchingStrategy: Any
    onlyMatchAtRGroups: Any
    removeAllHydrogenRGroups: Any
    removeAllHydrogenRGroupsAndLabels: Any
    removeHydrogensPostMatch: Any
    rgroupLabelling: Any
    scoreMethod: Any
    timeout: Any
    @classmethod
    def __init__(cls, *args, **kwargs) -> None: ...
    @classmethod
    def __reduce__(cls) -> Any: ...
    @property
    def substructMatchParams(self) -> Any: ...

class RGroupLabelling:
    AtomMap: ClassVar[RGroupLabelling] = ...
    Isotope: ClassVar[RGroupLabelling] = ...
    MDLRGroup: ClassVar[RGroupLabelling] = ...
    names: ClassVar[dict] = ...
    values: ClassVar[dict] = ...
    __slots__: ClassVar[tuple] = ...

class RGroupLabels:
    AtomIndexLabels: ClassVar[RGroupLabels] = ...
    AtomMapLabels: ClassVar[RGroupLabels] = ...
    AutoDetect: ClassVar[RGroupLabels] = ...
    DummyAtomLabels: ClassVar[RGroupLabels] = ...
    IsotopeLabels: ClassVar[RGroupLabels] = ...
    MDLRGroupLabels: ClassVar[RGroupLabels] = ...
    RelabelDuplicateLabels: ClassVar[RGroupLabels] = ...
    names: ClassVar[dict] = ...
    values: ClassVar[dict] = ...
    __slots__: ClassVar[tuple] = ...

class RGroupMatching:
    Exhaustive: ClassVar[RGroupMatching] = ...
    GA: ClassVar[RGroupMatching] = ...
    Greedy: ClassVar[RGroupMatching] = ...
    GreedyChunks: ClassVar[RGroupMatching] = ...
    NoSymmetrization: ClassVar[RGroupMatching] = ...
    names: ClassVar[dict] = ...
    values: ClassVar[dict] = ...
    __slots__: ClassVar[tuple] = ...

class RGroupScore:
    FingerprintVariance: ClassVar[RGroupScore] = ...
    Match: ClassVar[RGroupScore] = ...
    names: ClassVar[dict] = ...
    values: ClassVar[dict] = ...
    __slots__: ClassVar[tuple] = ...

def RGroupDecompose(*args, **kwargs) -> Any: ...
