docs: def initialize_parameters(self, variable_type_indices, names, operation=None, begin_range_name=None,
                                end_range_name=None, *args):
          """
          :param variable_type_indices: A sequence of variable type indices where each entry defines the
          index of a variable type in the design matrix. For example a design matrix with two variable types will have
          indices [j,n] where variable type A spans 0 to j and variable type B spans j + 1 to n.
          :param names:
          :param args:
          :param operation
          :param begin_range_name
          :param end_range_name
          :return:
          """
          self.names = names
          for r in variable_type_indices:
              if r[1] - r[0] < 2:
                  raise ValueError('Invalid range provided to Range Terminal: ' + str(r))
          rng = random.choice(variable_type_indices)
          self.lower_bound = rng[0]
          self.upper_bound = rng[1]
          if operation is not None and begin_range_name is not None and end_range_name is not None:
              if self.operations.get(operation) is None:
                  raise ValueError('Invalid operation provided to Range Terminal: ' + operation)
              if begin_range_name not in self.names:
                  raise ValueError('Invalid range name provided to Range Termnial: ' + str(begin_range_name))
              if end_range_name not in names:
                  raise ValueError('Invalid range name provided to Range Termnial: ' + str(end_range_name))
              begin_range = self.names.index(begin_range_name)
              end_range = self.names.index(end_range_name)
              valid = False
              for r in variable_type_indices:
                  if r[0] <= begin_range < end_range <= r[1]:
                      valid = True
              if not valid:
                  raise ValueError('Invalid range provided to Range Terminal: (' + str(begin_range) + ',' +
                                   str(end_range) + ')')
              self.operation = self.operations[operation]
              self.begin_range = begin_range
              self.end_range = end_range
          else:
              self.operation = random.choice(list(self.operations.values()))
              self.begin_range = np.random.randint(self.lower_bound, self.upper_bound - 1)
              self.end_range = np.random.randint(self.begin_range + 1, self.upper_bound)