Example #1
0
 def __init__(self,
              solver_file_path,
              cnf_file_path,
              reports_folder_path,
              threads_number,
              handled_parameters_indexes,
              # количество = количеству обрабатываемых активных параметров (лишних значений нет)
              start_parameters_values,
              max_delta,
              max_hamming_distance,
              min_hamming_distance=1):
     self.__solver_name = FileModule.get_file_name(solver_file_path)
     self.__solver_file_path = solver_file_path
     self.__cnf_file_path = cnf_file_path
     self.__reports_folder_path = reports_folder_path
     self.__handled_parameters_indexes = handled_parameters_indexes
     # start_parameters_values это массив, элементы которого могут быть:
     # bool значением для параметра типа BOOL
     # кортежем из 2-х double для параметра типа RANGE
     self.__start_parameters_values = start_parameters_values
     self.__last_parameters_values_tuple = list()
     self.__parameters_templates = SolversDescriptions.get_handled_parameters_template(self.__solver_name,
                                                                                       threads_number,
                                                                                       handled_parameters_indexes)
     parameters_classes = self.__create_parameters_classes()
     self.__max_delta = max_delta
     self.__values_factory = ParametersValuesFactory(parameters_classes,
                                                     max_delta,
                                                     max_hamming_distance,
                                                     min_hamming_distance)
Example #2
0
class ParametersModule(object):
    def __init__(self,
                 solver_file_path,
                 cnf_file_path,
                 reports_folder_path,
                 threads_number,
                 handled_parameters_indexes,
                 # количество = количеству обрабатываемых активных параметров (лишних значений нет)
                 start_parameters_values,
                 max_delta,
                 max_hamming_distance,
                 min_hamming_distance=1):
        self.__solver_name = FileModule.get_file_name(solver_file_path)
        self.__solver_file_path = solver_file_path
        self.__cnf_file_path = cnf_file_path
        self.__reports_folder_path = reports_folder_path
        self.__handled_parameters_indexes = handled_parameters_indexes
        # start_parameters_values это массив, элементы которого могут быть:
        # bool значением для параметра типа BOOL
        # кортежем из 2-х double для параметра типа RANGE
        self.__start_parameters_values = start_parameters_values
        self.__last_parameters_values_tuple = list()
        self.__parameters_templates = SolversDescriptions.get_handled_parameters_template(self.__solver_name,
                                                                                          threads_number,
                                                                                          handled_parameters_indexes)
        parameters_classes = self.__create_parameters_classes()
        self.__max_delta = max_delta
        self.__values_factory = ParametersValuesFactory(parameters_classes,
                                                        max_delta,
                                                        max_hamming_distance,
                                                        min_hamming_distance)

    def get_area(self):
        initializer = list()
        parameters_classes = self.__create_parameters_classes()
        for parameters_class in parameters_classes:
            if isinstance(parameters_class, BoolParameter):
                initializer.append((0, 1, 1))  # min, max, step
            elif isinstance(parameters_class, RangeParameter):
                start_val = parameters_class.get_start_value()
                step = parameters_class.get_step()
                if start_val-step*self.__max_delta <= parameters_class.get_min_value():
                    minv = parameters_class.get_min_value() + (start_val-parameters_class.get_min_value()) % step
                else:
                    minv = start_val-step*self.__max_delta
                if start_val+step*self.__max_delta >= parameters_class.get_max_value():
                    maxv = parameters_class.get_max_value() - (parameters_class.get_max_value()-start_val) % step
                else:
                    maxv = start_val+step*self.__max_delta
                initializer.append((minv,
                                    maxv,
                                    parameters_class.get_step()))
            else:
                raise RuntimeError("ParametersModule.get_area: .")
        return Area(initializer)

    def has_new_parameters_list(self):
        return self.__values_factory.has_new_parameters_tuples()

    def get_parameters_list(self):
        self.__last_parameters_values_tuple = self.__values_factory.create_parameters_tuple()
        result = list()
        result.append(self.__solver_file_path)  # первый параметр - это всегда путь до решателя
        active_param_index = 0
        for system_parameter_template in self.__parameters_templates:
            to_concat = system_parameter_template[0]
            parameter_string = ''
            for concrete_parameter_template in system_parameter_template[1]:
                if concrete_parameter_template[0] == 'BOOL':
                    if self.__last_parameters_values_tuple[active_param_index]:
                        parameter_sub_string = concrete_parameter_template[1]
                    else:
                        parameter_sub_string = concrete_parameter_template[2]
                    active_param_index += 1
                elif concrete_parameter_template[0] == 'RANGE':
                    parameter_sub_string = str(self.__last_parameters_values_tuple[active_param_index])
                    active_param_index += 1
                elif concrete_parameter_template[0] == 'STRING':
                    parameter_sub_string = concrete_parameter_template[1]
                elif concrete_parameter_template[0] == 'CNF':
                    parameter_sub_string = self.__cnf_file_path
                elif concrete_parameter_template[0] == 'OUTPUT':
                    parameter_sub_string = self.__reports_folder_path \
                        + self.__create_output_file_name(self.__last_parameters_values_tuple)
                else:
                    raise RuntimeError("ParametersModule.get_parameters_list: invalid type of parameter.")
                if len(parameter_sub_string) != 0:
                    if to_concat:
                        parameter_string += parameter_sub_string
                    else:
                        result.append(parameter_sub_string)
            if to_concat:
                result.append(parameter_string)
        return result

    def get_last_handled_parameters_values(self):
        return self.__last_parameters_values_tuple

    def get_last_parameters_list_index(self):
        return self.__values_factory.get_last_tuple_index()

    def get_parameters_str(self, parameters_values):
        return self.__create_output_file_name(parameters_values)

    def get_progress_string(self):
        return str(self.__values_factory.get_last_tuple_index()) + "/" \
            + str(self.__values_factory.get_number_of_parameters_tuples())

    def skip_start_values(self):
        self.__values_factory.create_parameters_tuple()

# ----------------------------------------------------------------------------------------------------------------------
    def __create_parameters_classes(self):
        # Для справки:
        # class BoolParameter.__init__(self, start_val)
        # class RangeParameter.__init__(self, start_val, min_val, max_val, step)
        result = list()
        active_parameter_index = 0
        for system_parameter_template in self.__parameters_templates:
            for concrete_parameter_template in system_parameter_template[1]:
                if (concrete_parameter_template[0] == 'BOOL') or (concrete_parameter_template[0] == 'RANGE'):
                    if len(self.__start_parameters_values)-1 < active_parameter_index:
                        raise RuntimeError('ParametersModule.__create_parameters_classes: number of start '
                                           'parameters values is not equal to the number of handled active '
                                           'parameters (please check your start values file).')
                    if concrete_parameter_template[0] == 'BOOL':
                        start_val = self.__start_parameters_values[active_parameter_index]
                        if isinstance(start_val, bool):
                            result.append(BoolParameter(start_val))
                        elif int(start_val) == 1:
                            result.append(BoolParameter(True))
                        elif int(start_val) == 0:
                            result.append(BoolParameter(False))
                        else:
                            raise RuntimeError("ParametersModule.__create_parameters_classes: "
                                               "invalid bool parameter val.")
                    elif concrete_parameter_template[0] == 'RANGE':
                        result.append(RangeParameter(self.__start_parameters_values[active_parameter_index][0],
                                                     concrete_parameter_template[1],
                                                     concrete_parameter_template[2],
                                                     self.__start_parameters_values[active_parameter_index][1]))
                    else:  # иные типы подпараметров нас не интересуют, ибо не являются "активными"
                        pass
                    active_parameter_index += 1
        return result

    def __create_output_file_name(self, parameters_values):
        result_file_name = ''
        handled_params_index = 0
        handled_params_indexes_number = len(self.__handled_parameters_indexes)
        param_index = -1
        full_templates = SolversDescriptions.get_parameters_template(self.__solver_name, 1)
        for system_parameter_template in full_templates:
            param_index += 1
            if handled_params_index >= handled_params_indexes_number:
                break
            if param_index == self.__handled_parameters_indexes[handled_params_index]:
                for concrete_parameter_template in system_parameter_template[1]:
                    if concrete_parameter_template[0] == 'BOOL':
                        if parameters_values[handled_params_index]:
                            result_file_name += str(param_index) + '-' + concrete_parameter_template[1] + '__'
                        else:
                            result_file_name += str(param_index) + '-' + concrete_parameter_template[2] + '__'
                    elif concrete_parameter_template[0] == 'RANGE':
                        result_file_name += str(param_index) + '-' \
                            + str(parameters_values[handled_params_index]) + '__'
                handled_params_index += 1
        return result_file_name[:len(result_file_name)-2]