class_docstr: caliban experiment
  
  This class constitutes a set of parameters used to perform an experiment
  using caliban. An Experiment is associated with a ContainerSpec and an
  ExperimentGroup. Thus an experiment describes a specific combination of
  parameters for a given ContainerSpec, which can then be used to create a
  job instance which will run on a specific compute platform like CAIP or GKE
  using a concrete instantiation of the docker container described by the
  ContainerSpec.
  
  Each Experiment can therefore be associated with multiple JobSpecs and
  Jobs, which are explicit executions of the experiment against a specific
  compute backend and docker container instance.
  
  Please do not instantiate this class directly via its constructor.
  Instead, use the Experiment.get_or_create() method, or query the database
  using a session.query() call. The get_or_create() method returns an existing
  experiment if a matching instance already exists in the database, or
  creates a new instance otherwise.
  
  properties:
  
  id (int): unique identifier
  created (datetime): creation time
  args (JSON): a list of positional args
  kwargs (JSON): a dictionary of keyword-args
  container_spec (ContainerSpec): the container spec associated with this experiment
  xgroup (ExperimentGroup): the experiment group associated with this experiment
  job_specs (Iterable[JobSpec]): job specs assocated with this experiment
  jobs (Iterable[Job]): job instances of this experiment
class_docstr_tok: ["caliban","experiment","This","class","constitutes","a","set","of","parameters","used","to","perform","an","experiment","using","caliban",".","An","Experiment","is","associated","with","a","ContainerSpec","and","an","ExperimentGroup",".","Thus","an","experiment","describes","a","specific","combination","of","parameters","for","a","given","ContainerSpec",",","which","can","then","be","used","to","create","a","job","instance","which","will","run","on","a","specific","compute","platform","like","CAIP","or","GKE","using","a","concrete","instantiation","of","the","docker","container","described","by","the","ContainerSpec",".","Each","Experiment","can","therefore","be","associated","with","multiple","JobSpecs","and","Jobs",",","which","are","explicit","executions","of","the","experiment","against","a","specific","compute","backend","and","docker","container","instance",".","Please","do","not","instantiate","this","class","directly","via","its","constructor",".","Instead",",","use","the","Experiment.get_or_create","(",")","method",",","or","query","the","database","using","a","session.query","(",")","call",".","The","get_or_create","(",")","method","returns","an","existing","experiment","if","a","matching","instance","already","exists","in","the","database",",","or","creates","a","new","instance","otherwise",".","properties",":","id","(","int",")",":","unique","identifier","created","(","datetime",")",":","creation","time","args","(","JSON",")",":","a","list","of","positional","args","kwargs","(","JSON",")",":","a","dictionary","of","keyword-args","container_spec","(","ContainerSpec",")",":","the","container","spec","associated","with","this","experiment","xgroup","(","ExperimentGroup",")",":","the","experiment","group","associated","with","this","experiment","job_specs","(","Iterable","[","JobSpec","]",")",":","job","specs","assocated","with","this","experiment","jobs","(","Iterable","[","Job","]",")",":","job","instances","of","this","experiment"]
docstr: Experiment
  
  Args:
  args: positional arguments for this experiment
  kwargs: keyword-args for this experiment
docstr_tok: ["Experiment","Args",":","args",":","positional","arguments","for","this","experiment","kwargs",":","keyword-args","for","this","experiment"]
code: def __init__(
      self,
      args: Optional[List[str]] = None,
      kwargs: Optional[Dict[str, Any]] = None,
  ):
      """Experiment
  
      Args:
      args: positional arguments for this experiment
      kwargs: keyword-args for this experiment
      """
      self.args = args
      self.kwargs = sorted_dict(kwargs)
      self.created = datetime.now().astimezone()
  
imports: import json
  from collections import OrderedDict
  from datetime import datetime
  from enum import Enum
  from typing import Any, Dict, List, Optional
  import sqlalchemy
  from sqlalchemy import JSON, Column, DateTime, ForeignKey, Integer, String
  from sqlalchemy.engine.base import Engine
  from sqlalchemy.ext.declarative import declarative_base
  from sqlalchemy.orm import Session, backref, relationship, sessionmaker
  from sqlalchemy.orm.session import object_session
  from caliban.util import current_user
label_desc: Use image node_id 1 to create a new Experiment object from inherited base classes: Base with example: obj = Experiment(args, kwargs)