code: def test_phases_end_to_end(self):
      train_dataset, test_dataset = testing_utils.get_holdout_data(
          train_samples=128,
          test_samples=64,
          input_shape=(10,),
          num_classes=10,
          random_seed=42,
      )
  
      # TODO: Consider performing `tf.data.Dataset` transformations
      # within get_test_data function.
      train_dataset = train_dataset.batch(32)
      test_dataset = test_dataset.batch(32)
  
      model1 = tf.keras.Sequential(
          [
              tf.keras.layers.Dense(64, activation="relu"),
              tf.keras.layers.Dense(10),
          ]
      )
      model1.compile(
          optimizer=tf.keras.optimizers.Adam(0.01),
          loss="mse",
          metrics=["mae"],
      )
  
      model2 = tf.keras.Sequential(
          [
              tf.keras.layers.Dense(64, activation="relu"),
              tf.keras.layers.Dense(64, activation="relu"),
              tf.keras.layers.Dense(10),
          ]
      )
      model2.compile(
          optimizer=tf.keras.optimizers.Adam(0.01),
          loss="mse",
          metrics=["mae"],
      )
  
      # TODO: This test could potentially have the best model be
      # a non-ensemble Keras model. Therefore, need to address this issue and
      # remove the freeze_submodels flag.
      ensemble = MeanEnsemble(
          submodels=[model1, model2], freeze_submodels=False
      )
      ensemble.compile(
          optimizer=tf.keras.optimizers.Adam(0.01),
          loss="mse",
          metrics=["mae"],
      )
  
      controller = SequentialController(
          phases=[
              InputPhase(train_dataset, test_dataset),
              KerasTrainerPhase([model1, model2]),
              KerasTrainerPhase([ensemble]),
          ]
      )
  
      model_search = ModelSearch(controller)
      model_search.run()
      self.assertIsInstance(
          model_search.get_best_models(num_models=1)[0], MeanEnsemble
      )
  
imports: import os
  import shutil
  import sys
  import time
  from absl import flags
  from absl.testing import parameterized
  from adanet.experimental.controllers.sequential_controller import SequentialController
  from adanet.experimental.keras import testing_utils
  from adanet.experimental.keras.ensemble_model import MeanEnsemble
  from adanet.experimental.keras.model_search import ModelSearch
  from adanet.experimental.phases.autoensemble_phase import AutoEnsemblePhase
  from adanet.experimental.phases.autoensemble_phase import GrowStrategy
  from adanet.experimental.phases.autoensemble_phase import MeanEnsembler
  from adanet.experimental.phases.input_phase import InputPhase
  from adanet.experimental.phases.keras_trainer_phase import KerasTrainerPhase
  from adanet.experimental.phases.keras_tuner_phase import KerasTunerPhase
  from adanet.experimental.phases.repeat_phase import RepeatPhase
  from adanet.experimental.storages.in_memory_storage import InMemoryStorage
  from kerastuner import tuners
  import tensorflow.compat.v2
label_desc: Use image node_id 3 for calling the ModelSearchTest obj's underlying member method code with example usage: obj.test_phases_end_to_end() without return types