class_docstr: A datapoint represents a single measurement of metrics - for instance a model checkpoint that is evaluated.
  It can have a parent if it originates from another one (offspring).
  
  
  :ivar uid: A unique identifier for this datapoint
  :ivar values: A dictionary with arbitrary metrics/values
  :ivar from_uid: The uid of the parent :class:`Datapoint` (tp.Optional)
  
  :Example:
  
  .. code-block:: python
  
      import hiplot as hip
      dp1 = hip.Datapoint(uid="parent", values={"loss": 0.0})
      dp2 = hip.Datapoint(uid="child", from_uid="parent", values={
          "loss": 1.0,
          "another_metric": 0.0  # Different datapoints can have different metrics
      })
      hip.Experiment(datapoints=[dp1, dp2]).display()  # Render in an ipython notebook
docstr: Makes sure this object is valid - throws an :class:`hiplot.ExperimentValidationError` exception otherwise.
docstr_tok: ["Makes","sure","this","object","is","valid","-","throws","an",":","class",":","`","hiplot.ExperimentValidationError","`","exception","otherwise","."]
code: def validate(self) -> None:
      """
      Makes sure this object is valid - throws an :class:`hiplot.ExperimentValidationError` exception otherwise.
      """
      for reserved_kw in ["uid", "from_uid"]:
          if reserved_kw in self.values:
              raise ExperimentValidationError(
                  f'Datapoint {self.uid} contains a value for "{reserved_kw}"'
              )
  
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 Datapoint obj's underlying member method code with example usage: obj.validate() without return types