class_docstr: Holds information about a molecules.
  
  Resorts order of atoms internally to be in order of increasing degree. Note
  that only heavy atoms (hydrogens excluded) are considered here.
class_docstr_tok: ["Holds","information","about","a","molecules",".","Resorts","order","of","atoms","internally","to","be","in","order","of","increasing","degree",".","Note","that","only","heavy","atoms","(","hydrogens","excluded",")","are","considered","here","."]
docstr: Parameters
  ----------
  atom_features: np.ndarray
      Has shape (n_atoms, n_feat)
  adj_list: list
      List of length n_atoms, with neighor indices of each atom.
  max_deg: int, optional
      Maximum degree of any atom.
  min_deg: int, optional
      Minimum degree of any atom.
docstr_tok: ["Parameters","--","--","--","--","--","atom_features",":","np.ndarray","Has","shape","(","n_atoms",",","n_feat",")","adj_list",":","list","List","of","length","n_atoms",",","with","neighor","indices","of","each","atom",".","max_deg",":","int",",","optional","Maximum","degree","of","any","atom",".","min_deg",":","int",",","optional","Minimum","degree","of","any","atom","."]
code: def __init__(self, atom_features, adj_list, max_deg=10, min_deg=0):
      """
      Parameters
      ----------
      atom_features: np.ndarray
          Has shape (n_atoms, n_feat)
      adj_list: list
          List of length n_atoms, with neighor indices of each atom.
      max_deg: int, optional
          Maximum degree of any atom.
      min_deg: int, optional
          Minimum degree of any atom.
      """
  
      self.atom_features = atom_features
      self.n_atoms, self.n_feat = atom_features.shape
      self.deg_list = np.array(
          [len(nbrs) for nbrs in adj_list], dtype=np.int32
      )
      self.canon_adj_list = adj_list
      self.deg_adj_lists = []
      self.deg_slice = []
      self.max_deg = max_deg
      self.min_deg = min_deg
  
      self.membership = self.get_num_atoms() * [0]
  
      self._deg_sort()
  
      # Get the degree id list (which corrects for min_deg)
      self.deg_id_list = np.array(self.deg_list) - min_deg
  
      # Get the size of each degree block
      deg_size = [
          self.get_num_atoms_with_deg(deg)
          for deg in range(self.min_deg, self.max_deg + 1)
      ]
  
      self.degree_list = []
      for i, deg in enumerate(range(self.min_deg, self.max_deg + 1)):
          self.degree_list.extend([deg] * deg_size[i])
  
      # Get the the start indices for items in each block
      self.deg_start = cumulative_sum(deg_size)
  
      # Get the node indices when they are reset when the degree changes
      deg_block_indices = [
          i - self.deg_start[self.deg_list[i]]
          for i in range(self.n_atoms)
      ]
  
      # Convert to numpy array
      self.deg_block_indices = np.array(
          deg_block_indices, dtype=np.int32
      )
  
imports: import csv
  import random
  import numpy
label_desc: Use image node_id 1 to create a new ConvMol object from inherited base classes: object with example: obj = ConvMol(atom_features, adj_list, max_deg, min_deg)