Project: 065_LLM-SR_Scientific_Equation_Discovery_via_Programmi | Function: _extract_function_names (iclr)

system: You are an expert Python programmer implementing algorithms from scientific papers.
Complete the masked function based on the algorithm description.
Follow Python best practices and maintain consistent code style.
Return **only** the complete Python function code.

user: Complete this Python function:

**DESCRIPTION:** Function extraction from template with decorator-based parsing that identifies core equation functions and evaluation functions from the boilerplate code template, enabling LLM-generated equation skeletons

**KEY TERMS:** {
  "specification": "boilerplate code template for the task",
  "run_functions": "@evaluate.run decorated evaluation function",
  "evolve_functions": "@equation.evolve decorated equation function",
  "code_manipulation.yield_decorated": "decorator extraction method"
}

**CONTEXT CODE:** # Copyright 2023 DeepMind Technologies Limited
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#    http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# ==============================================================================

""" Implementation of the LLMSR pipeline. """
from __future__ import annotations

# from collections.abc import Sequence
from typing import Any, Tuple, Sequence

from llmsr import code_manipulation
from llmsr import config as config_lib
from llmsr import evaluator
from llmsr import buffer
from llmsr import sampler
from llmsr import profile


def _extract_function_names(specification: str) -> Tuple[str, str]:
    """ Return the name of the function to evolve and of the function to run.

    The so-called specification refers to the boilerplate code template for a task.
    The template MUST have two important functions decorated with '@evaluate.run', '@equation.evolve' respectively.
    The function labeled with '@evaluate.run' is going to evaluate the generated code (like data-diven fitness evaluation).
    The function labeled with '@equation.evolve' is the function to be searched (like 'equation' structure).
    """
    raise NotImplementedError("Function implementation has been masked for testing")

def main(
        specification: str,
        inputs: "Sequence[Any]",
        config: "config_lib.Config",
        max_sample_nums: "int | None",
        class_config: "config_lib.ClassConfig",
        **kwargs
):
    """ Launch a LLMSR experiment.
    Args:
        specification: the boilerplate code for the problem.
        inputs       : the data instances for the problem.
        config       : config file.
        max_sample_nums: the maximum samples nums from LLM. 'None' refers to no stop.
    """
    raise NotImplementedError("Function implementation has been masked for testing")


Complete the function implementation replacing "raise NotImplementedError".