from _typeshed import Incomplete
from collections.abc import Callable, Generator, Hashable, Iterable
from typing import Any

__all__ = ["ISMAGS"]

def are_all_equal(iterable: Iterable[Any]) -> bool: ...
def make_partition(
    items: Iterable[Hashable], test: Callable[[Hashable, Hashable], bool], check: bool = True
) -> list[set[Incomplete]]: ...
def node_to_part_ID_dict(partition: Iterable[Iterable[Incomplete]]) -> dict[Incomplete, int]: ...
def color_degree_by_node(G, n_colors, e_colors): ...

class EdgeLookup:
    edge_dict: Incomplete
    def __init__(self, edge_dict) -> None: ...
    def __getitem__(self, edge): ...
    def items(self): ...

class ISMAGS:
    graph: Incomplete
    subgraph: Incomplete

    def __init__(self, graph, subgraph, node_match=None, edge_match=None, cache=None) -> None: ...
    def create_aligned_partitions(self, thing_matcher, sg_things, g_things): ...
    def find_isomorphisms(self, symmetry: bool = True) -> Generator[Incomplete, Incomplete, Incomplete]: ...
    def largest_common_subgraph(self, symmetry: bool = True) -> Generator[Incomplete, Incomplete]: ...
    def analyze_subgraph_symmetry(self) -> dict[Hashable, set[Hashable]]: ...
    def is_isomorphic(self, symmetry: bool = False) -> bool: ...
    def subgraph_is_isomorphic(self, symmetry: bool = False) -> bool: ...
    def isomorphisms_iter(self, symmetry: bool = True) -> Generator[Incomplete, Incomplete]: ...
    def subgraph_isomorphisms_iter(self, symmetry: bool = True): ...
