code: def __init__(
      self,
      dim,
      func,
      func_args=(),
      symmetry=False,
      bounds=None,
      g_cons=None,
      g_args=(),
  ):
      self.dim = dim
      self.bounds = bounds
      self.symmetry = symmetry  # TODO: Define the functions to be used
      #      here in init to avoid if checks
      self.gen = 0
      self.perm_cycle = 0
  
      # Every cell is stored in a list of its generation,
      # e.g., the initial cell is stored in self.H[0]
      # 1st get new cells are stored in self.H[1] etc.
      # When a cell is subgenerated it is removed from this list
  
      self.H = []  # Storage structure of cells
      # Cache of all vertices
      self.V = VertexCache(func, func_args, bounds, g_cons, g_args)
  
      # Generate n-cube here:
      self.n_cube(dim, symmetry=symmetry)
  
      # TODO: Assign functions to a the complex instead
      if symmetry:
          self.generation_cycle = 1
          # self.centroid = self.C0()[-1].x
          # self.C0.centroid = self.centroid
      else:
          self.add_centroid()
  
      self.H.append([])
      self.H[0].append(self.C0)
      self.hgr = self.C0.homology_group_rank()
      self.hgrd = 0  # Complex group rank differential
      # self.hgr = self.C0.hg_n
  
      # Build initial graph
      self.graph_map()
  
      self.performance = []
      self.performance.append(0)
      self.performance.append(0)
  
imports: import numpy
  import copy
label_desc: Use image node_id 1 to create a new Complex object  with example: obj = Complex(dim, func, func_args, symmetry, bounds, g_cons, g_args)