def METHOD_NAME(self, sdfg: SDFG, _) -> Optional[Set[Tuple[int, str]]]:
    """
    Propagates constants throughout the SDFG.
    :param sdfg: The SDFG to modify.
    :param pipeline_results: If in the context of a ``Pipeline``, a dictionary that is populated with prior Pass
                             results as ``{Pass subclass name: returned object from pass}``. If not run in a
                             pipeline, an empty dictionary is expected.
    :param initial_symbols: If not None, sets values of initial symbols.
    :return: A set of propagated constants, or None if nothing was changed.
    """
    result: Set[str] = set()
    symbols_to_consider = self.symbols or set(sdfg.symbols.keys())
    # Compute used symbols
    used_symbols = self.used_symbols(sdfg)
    # Remove unused symbols
    for sym in symbols_to_consider - used_symbols:
        if sym in sdfg.symbols:
            sdfg.remove_symbol(sym)
            result.add(sym)
    if self.recursive:
        # Prune nested SDFGs recursively
        sid = sdfg.sdfg_id
        result = set((sid, sym) for sym in result)
        for state in sdfg.nodes():
            for node in state.nodes():
                if isinstance(node, nodes.NestedSDFG):
                    old_symbols = self.symbols
                    self.symbols = set()
                    nres = self.METHOD_NAME(node.sdfg, _)
                    self.symbols = old_symbols
                    if nres:
                        result.update(nres)
    # Return result
    return result or None