: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:

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)