code: def skyline(
      data_stream: Iterable[PatternMatch],
  ) -> Iterable[PatternMatch]:
      """
      Keep only those entries which are in the support-confidence skyline.
  
      A pair $(s, c)$ dominates $(s', c')$ if $s > s'$ and $c > c'$. The skyline contains those entries which are not
      dominated by any other entry.
  
      :param data_stream:
          The stream of data, comprising tuples (relation_id, pattern-type, support, confidence).
  
      :yields: An entry from the support-confidence skyline.
      """
      # group by (relation id, pattern type)
      data: DefaultDict[
          Tuple[int, str], Set[Tuple[int, float]]
      ] = defaultdict(set)
      for tup in data_stream:
          data[tup[:2]].add(tup[2:])
      # for each group, yield from skyline
      for (r_id, pat), values in data.items():
          for supp, conf in _get_skyline(values):
              yield PatternMatch(r_id, pat, supp, conf)
  
imports: import hashlib
  import itertools
  import logging
  from collections import defaultdict
  from typing import Collection, DefaultDict, Iterable, Mapping, NamedTuple, Optional, Sequence, Set, Tuple, Union
  import numpy
  import pandas
  from tqdm.auto import tqdm
  from .None import TriplesFactory
  from ..constants import COLUMN_LABELS, TARGET_TO_INDEX
  from ..typing import COLUMN_HEAD, COLUMN_RELATION, COLUMN_TAIL, LABEL_HEAD, LABEL_RELATION, LABEL_TAIL, MappedTriples
label_desc: Use image node_id 17 for calling a global function with example usage: skyline(data_stream) without return types