class_docstr: This class is initialized with the name of a json configuration file.
  The config contains information about a classification method and the
  hyperparameter arguments it needs to run. Its main purpose is to generate
  hyperpartitions (possible combinations of categorical hyperparameters).
docstr: Some things are fixed. Make a choice from the things that aren't fixed
  and see where that leaves us. Recurse.
  
  fixed_cats: a list of (name, value) tuples of qualified categorical
      variables
  constants: a list of (name, value) tuples of fixed constants
  free_cats: a list of names of free categorical variables
  tunables: a list of names of free tunable parameters
  
  Returns: a list of HyperPartition objects
docstr_tok: ["Some","things","are","fixed",".","Make","a","choice","from","the","things","that","are","n't","fixed","and","see","where","that","leaves","us",".","Recurse",".","fixed_cats",":","a","list","of","(","name",",","value",")","tuples","of","qualified","categorical","variables","constants",":","a","list","of","(","name",",","value",")","tuples","of","fixed","constants","free_cats",":","a","list","of","names","of","free","categorical","variables","tunables",":","a","list","of","names","of","free","tunable","parameters","Returns",":","a","list","of","HyperPartition","objects"]
code: def _enumerate(self, fixed_cats, constants, free_cats, tunables):
      """
      Some things are fixed. Make a choice from the things that aren't fixed
      and see where that leaves us. Recurse.
  
      fixed_cats: a list of (name, value) tuples of qualified categorical
          variables
      constants: a list of (name, value) tuples of fixed constants
      free_cats: a list of names of free categorical variables
      tunables: a list of names of free tunable parameters
  
      Returns: a list of HyperPartition objects
      """
      # if there are no more free variables, we have a new HyperPartition. We've
      # reached the bottom of the recursion, so return.
      if not free_cats:
          return [HyperPartition(fixed_cats, constants, tunables)]
  
      parts = []
  
      # fix a single categorical parameter, removing it from the list of free
      # variables, and see where that takes us
      cat = free_cats.pop(0)
  
      for val in self.parameters[cat].values:
          # add this value to the list of qualified categoricals
          new_fixed_cats = fixed_cats + [(cat, val)]
  
          # these lists are copied for now
          new_constants = constants[:]
          new_free_cats = free_cats[:]
          new_tunables = tunables[:]
  
          # check if choosing this value opens up new parts of the conditional
          # parameter tree.
          # we need to check conditions for str(val) because all keys in json
          # must be strings.
          if (
              cat in self.conditions
              and str(val) in self.conditions[cat]
          ):
              # categorize the conditional variables which are now in play
              new_params = self.conditions[cat][str(val)]
              cons, cats, tuns = self._sort_parameters(new_params)
              new_constants = constants + cons
              new_free_cats = free_cats + cats
              new_tunables = tunables + tuns
  
          # recurse with the newly qualified categorical as a constant
          parts.extend(
              self._enumerate(
                  fixed_cats=new_fixed_cats,
                  constants=new_constants,
                  free_cats=new_free_cats,
                  tunables=new_tunables,
              )
          )
  
      return parts
  
imports: from __future__ import absolute_import, unicode_literals
  import json
  import os
  from builtins import object, range
  from builtins import str
  import btb
  from atm.constants import METHODS
label_desc: Use image node_id 3 for calling the Method obj's underlying member method code with example usage: obj._enumerate(fixed_cats, constants, free_cats, tunables) and returns: parts, list