class_docstr: Record of the Experiment creation event. This can be used for telemetry in settings
  where many Experiments are being created either manually or programatically. In
  order to facilitate easy serialization only include simple types: numbers, strings,
  bools, and None.
code: def from_experiment(
      cls, experiment: Experiment
  ) -> ExperimentCreatedRecord:
      (
          num_continuous_range_parameters,
          num_int_range_parameters_small,
          num_int_range_parameters_medium,
          num_int_range_parameters_large,
          num_log_scale_range_parameters,
          num_unordered_choice_parameters_small,
          num_unordered_choice_parameters_medium,
          num_unordered_choice_parameters_large,
          num_fixed_parameters,
      ) = cls._get_param_counts_from_search_space(
          search_space=experiment.search_space
      )
  
      return cls(
          experiment_name=experiment._name,
          experiment_type=experiment._experiment_type,
          num_continuous_range_parameters=num_continuous_range_parameters,
          num_int_range_parameters_small=num_int_range_parameters_small,
          num_int_range_parameters_medium=num_int_range_parameters_medium,
          num_int_range_parameters_large=num_int_range_parameters_large,
          num_log_scale_range_parameters=num_log_scale_range_parameters,
          num_unordered_choice_parameters_small=num_unordered_choice_parameters_small,
          num_unordered_choice_parameters_medium=(
              num_unordered_choice_parameters_medium
          ),
          num_unordered_choice_parameters_large=num_unordered_choice_parameters_large,
          num_fixed_parameters=num_fixed_parameters,
          dimensionality=sum(
              1
              for param in experiment.parameters.values()
              if param.cardinality() > 1
          ),
          hierarchical_tree_height=experiment.search_space.height
          if isinstance(
              experiment.search_space, HierarchicalSearchSpace
          )
          else 1,
          num_parameter_constraints=len(
              experiment.search_space.parameter_constraints
          ),
          num_objectives=len(
              experiment.optimization_config.objective.metrics
          )
          if experiment.optimization_config is not None
          else 0,
          num_tracking_metrics=len(experiment.tracking_metrics),
          num_outcome_constraints=len(
              experiment.optimization_config.outcome_constraints
          )
          if experiment.optimization_config is not None
          else 0,
          num_map_metrics=sum(
              1
              for metric in experiment.metrics.values()
              if isinstance(metric, MapMetric)
          ),
          metric_cls_to_quantity={
              cls_name: sum(
                  1
                  for metric in experiment.metrics.values()
                  if metric.__class__.__name__ == cls_name
              )
              for cls_name in {
                  metric.__class__.__name__
                  for metric in experiment.metrics.values()
              }
          },
          runner_cls=experiment.runner.__class__.__name__,
      )
  
file_path: Ax/ax/telemetry/experiment.py
imports: from __future__ import annotations
  from dataclasses import dataclass
  from math import inf
  from typing import Dict, List, Optional, Tuple
  from ax.core.base_trial import TrialStatus
  from ax.core.experiment import Experiment
  from ax.core.map_metric import MapMetric
  from ax.core.parameter import ChoiceParameter, FixedParameter, ParameterType, RangeParameter
  from ax.core.search_space import HierarchicalSearchSpace, SearchSpace
  from ax.core.utils import get_model_times
  from ax.telemetry.common import INITIALIZATION_MODELS, OTHER_MODELS
label_desc: Use image node_id 1 for calling the ExperimentCreatedRecord obj's underlying member method code with example usage: obj.from_experiment(cls, experiment) and returns: cls