code: def run_experiment(
      train_data_path,
      test_data_path,
      save_dir,
      timeout_per_run: Optional[float] = 10,
      num_generations: int = 20,
  ):
      train_data = InputData.from_csv(
          train_data_path, target_columns="target"
      )
      test_data = InputData.from_csv(
          test_data_path, target_columns="target"
      )
  
      all_mutations = [
          MutationTypesEnum.simple,
          MutationTypesEnum.growth,
          MutationTypesEnum.reduce,
      ]
      mutation_types = [
          [MutationTypesEnum.simple],
          [MutationTypesEnum.growth],
          [MutationTypesEnum.reduce],
          all_mutations,
      ]
      all_crossovers = [
          CrossoverTypesEnum.one_point,
          CrossoverTypesEnum.subtree,
      ]
      crossover_types = [
          [CrossoverTypesEnum.one_point],
          [CrossoverTypesEnum.subtree],
          all_crossovers,
      ]
  
      mutation_histories = []
      for label, mutations in zip(mutation_labels, mutation_types):
          label = label.lower().replace(" ", "_")
          history_file_path = f"{save_dir}/{label}.json"
  
          history = run_single(
              train_data,
              test_data,
              timeout=timeout_per_run,
              num_generations=num_generations,
              mutation_types=mutations,
              crossover_types=all_crossovers,
          )
          mutation_histories.append(history)
          print(f"history is saved to path {history_file_path}")
          history.save(history_file_path)
  
      crossover_histories = []
      for label, crossover in zip(crossover_labels, crossover_types):
          label = label.lower().replace(" ", "_")
          history_file_path = f"{save_dir}/{label}.json"
  
          history = run_single(
              train_data,
              test_data,
              timeout=timeout_per_run,
              mutation_types=all_mutations,
              crossover_types=crossover,
          )
          crossover_histories.append(history)
          print(f"history is saved to path {history_file_path}")
          history.save(history_file_path)
  
      visualize_histories(mutation_histories, mutation_labels)
      visualize_histories(crossover_histories, crossover_labels)
  
imports: import os
  from datetime import timedelta
  from typing import Sequence, Optional
  import numpy
  from matplotlib import pyplot
  from sklearn.metrics import roc_auc_score
  from fedot.core.composer.composer_builder import ComposerBuilder
  from fedot.core.data.data import InputData
  from golem.core.optimisers.genetic.gp_params import GPAlgorithmParameters
  from golem.core.optimisers.genetic.operators.crossover import CrossoverTypesEnum
  from golem.core.optimisers.genetic.operators.inheritance import GeneticSchemeTypesEnum
  from golem.core.optimisers.genetic.operators.mutation import MutationTypesEnum
  from golem.core.optimisers.opt_history_objects.opt_history import OptHistory
  from fedot.core.pipelines.pipeline_composer_requirements import PipelineComposerRequirements
  from fedot.core.repository.operation_types_repository import get_operations_for_task
  from fedot.core.repository.metrics_repository import ClassificationMetricsEnum
  from fedot.core.repository.tasks import Task, TaskTypesEnum
  from fedot.core.utils import fedot_project_root
label_desc: Use image node_id 4 for calling a global function with example usage: run_experiment(train_data_path, test_data_path, save_dir, timeout_per_run, num_generations) without return types