class_docstr: Object that can be rendered by HiPlot. It essential contains a list of metrics, but also some options on how to render it.
  
  See :meth:`Experiment.display` to display an :class:`Experiment` in an ipython notebook.
  
  :ivar datapoints: All the measurements we have. One datapoint corresponds to one line in the parallel plot and to one line in the table.
  :ivar parameters_definition: Characteristics of the columns (ordering, type, etc...)
  :ivar colormap: Colormap to use
  :ivar colorby: Default column to color by
  :ivar weightcolumn: If rows have different weights, use this column as the weight (default to 1 if not specified)
  :ivar enabledDisplays: Ordered displays to enable (by default all are enabled)
  
  :Example:
  
  .. code-block:: python
  
      import hiplot as hip
      data = [{'param': 1, 'loss': 10, 'hidden_field': 'value1', 'c': 'red'},
          {'param': 2, 'loss': 5, 'hidden_field': 'value2', 'c': 'black'}]
      exp = hip.Experiment.from_iterable(data)
docstr: Makes sure that this object is valid. Raises a :class:`hiplot.ExperimentValidationError` otherwise.
  Experiments with circular references, non-existent parents, or without datapoints are invalid.
docstr_tok: ["Makes","sure","that","this","object","is","valid",".","Raises","a",":","class",":","`","hiplot.ExperimentValidationError","`","otherwise",".","Experiments","with","circular","references",",","non-existent","parents",",","or","without","datapoints","are","invalid","."]
code: def validate(self) -> "Experiment":
      """
      Makes sure that this object is valid. Raises a :class:`hiplot.ExperimentValidationError` otherwise.
      Experiments with circular references, non-existent parents, or without datapoints are invalid.
      """
      seen: tp.Set[str] = set()
      dp_lookup: tp.Dict[str, Datapoint] = {
          dp.uid: dp for dp in self.datapoints
      }
      for p in self.datapoints:
          if p.uid not in seen:
              seen_now: tp.Set[str] = {p.uid}
              dp = p
              while dp.from_uid is not None and dp.from_uid not in seen:
                  if dp.from_uid in seen_now:
                      raise ExperimentValidationCircularRef(
                          f"Circular reference in {p} parents ({len(seen_now)}-th parent)"
                      )
                  seen_now.add(dp.from_uid)
                  if dp.from_uid not in dp_lookup:
                      raise ExperimentValidationMissingParent(
                          f"Datapoint ({dp.uid}) parent ({dp.from_uid}) not found"
                      )
                  dp = dp_lookup[dp.from_uid]
              seen |= seen_now
          p.validate()
      if not self.datapoints:
          raise ExperimentValidationError("Not a single datapoint")
      validate_colormap(self.colormap)
      return self
  
imports: import csv
  import uuid
  import json
  import codecs
  import warnings
  from abc import ABCMeta, abstractmethod
  from enum import Enum
  from collections import defaultdict
  from pathlib import Path
  import typing
label_desc: Use image node_id 2 for calling the Experiment obj's underlying member method code with example usage: obj.validate() and returns: self