Exemple #1
0
def _init_file_for_PARK(model: object, pair: object) -> None:
    import os
    try:
        range_1 = RangeValue.objects.filter(pair=pair).filter(option=pair.id_option_1).filter(value=1).first()
        range_2 = RangeValue.objects.filter(pair=pair).filter(option=pair.id_option_2).filter(value=1).first()

        value_1 = Value.objects.filter(id_option=pair.id_option_1).filter(id_criterion=range_1.criteria).first()
        value_2 = Value.objects.filter(id_option=pair.id_option_2).filter(id_criterion=range_2.criteria).first()

    except Exception as e:
        print(e)
    path_dir = f'{MEDIA_ROOT}/files/models/{str(model.id)}'
    try:
        os.mkdir(path_dir)
    except:
        pass

    path_dir = f'{MEDIA_ROOT}/files/models/{str(model.id)}/pacom/'
    try:
        os.mkdir(path_dir)
    except Exception as e:
        pass

    path = f'{path_dir}PAIR{str(pair.id)}.txt'
    line = f'{str(value_1.id_criterion.number)}|{str(value_2.id_criterion.number)}'
    _write_file(line, path)
    PairsOfOptionsPARK.objects.filter(id=pair.id).update(init_file=True)
Exemple #2
0
def _take_one_criterion_for_each_alternative(option_1_line, option_2_line,
                                             path, data, model_m, pair):
    _write_file(f'{option_1_line}|{option_2_line}|=0\n', path)
    """ Разделили строку по разделителю """
    list_1 = option_1_line.split(';')
    list_2 = option_2_line.split(';')
    """ Номер строки из последнего тестирования А1"""
    new_line_1 = int(list_1[-1])
    """Следующая строка"""
    line_begin = data[new_line_1 + 1]
    """ Номер строки из последнего тестирования А2"""
    new_line_2 = int(list_2[-1])
    """Следующая строка"""
    line_end = data[new_line_2 - 1]

    if (float(line_end[1]) >= 0) or (float(line_begin[1]) <= 0):
        """ Сошлись к центру """
        return converged_to_the_center(model_m, pair, line_begin, line_end)

    else:
        option_2_line = str(new_line_2 - 1)
        option_1_line = str(new_line_1 + 1)
        name_1, name_2 = _get_name_1_and_name_2(model_m, line_end, line_begin)
        return False, None, name_1, name_2, option_1_line, option_2_line
Exemple #3
0
def _fill_file_alternative(model, pair):
    path = f'{MEDIA_ROOT}/files/models/{str(pair.id_model.id)}/pacom/PAIR{str(pair.id)}.txt'
    last_line = _get_last_line(path)

    set_1_line = last_line.split('|')[0]
    set_2_line = last_line.split('|')[1].split('=')[0]
    result = int(last_line.split('|')[1].split('=')[1])
    set_1 = set_1_line.split(';')
    set_2 = set_2_line.split(';')

    if pair.compensable_option == pair.id_option_1:
        id_compensable_option = 1
    else:
        id_compensable_option = 2

    criterion_1 = Criterion.objects.get(id_model=model, number=set_1[-1])
    criterion_2 = Criterion.objects.get(id_model=model, number=set_2[-1])

    range_obj_next_1 = None
    range_obj_next_2 = None

    if result == 0 or result == 1 or (result == 2 and id_compensable_option == 2):
        range_obj_old_1 = RangeValue.objects.filter(pair=pair, option=pair.id_option_1, criteria=criterion_1).first()
        range_obj_next_1 = RangeValue.objects.filter(pair=pair, option=pair.id_option_1, value=range_obj_old_1.value + 1).first()

    if result == 0 or result == 2 or (result == 1 and id_compensable_option == 1):
        range_obj_old_2 = RangeValue.objects.filter(pair=pair, option=pair.id_option_2, criteria=criterion_2).first()
        range_obj_next_2 = RangeValue.objects.filter(pair=pair, option=pair.id_option_2, value=range_obj_old_2.value + 1).first()

    if (range_obj_next_1 is not None) and (range_obj_next_2 is not None):
        line = f'{str(range_obj_next_1.criteria.number)}|{str(range_obj_next_2.criteria.number)}'
        _write_file(line, path)

    elif result == 1 and (range_obj_next_1 is not None):
        set_1.append(range_obj_next_1.criteria.number)
        new_line = _fill_line_from_list(set_1)
        line = f'{new_line}|{set_2_line}'
        _write_file(line, path)

    elif result == 2 and (range_obj_next_2 is not None):
        set_2.append(range_obj_next_2.criteria.number)
        new_line = _fill_line_from_list(set_2)
        line = f'{set_1_line}|{new_line}'
        _write_file(line, path)

    else:
        if range_obj_next_2 is None:
            _find_winner_in_pair(pair,  option_2_is_empty=True)
        elif range_obj_next_1 is None:
            _find_winner_in_pair(pair, option_1_is_empty=True)
        else:
            _find_winner_in_pair(pair)
        return True

    return False
Exemple #4
0
def write_snod_modification_answer(answer, message=None):
    answer, option_1, option_2, option_1_line, option_2_line, model_id, question = get_data_from_meaage(
        answer, message)
    model_m = ModelModification.objects.get(id=model_id)
    pair = ModificationPairsOfOptions.objects.filter(
        option_1=option_1, option_2=option_2).first()

    data, delimeter_line, n = _read_file(model_m, pair)

    path = f'{MEDIA_ROOT}/files/models/{str(model_m.model.id)}/original_snod/modification/{str(model_m.id)}/{str(pair.id)}.txt'
    name_1, name_2 = '', ''
    flag_new_pair = False

    if answer == 1:
        """Важнее преимущество по критерию а1"""

        find_delimeter = option_1_line.find(';')
        if find_delimeter == -1:
            """Строка состоит из одного критерия"""
            _write_file(f'{option_1_line}|{option_2_line}|=1\n', path)

            list_2 = option_2_line.split(
                ';')  # Разделили строку по разделителю
            new_line_2 = int(
                list_2[-1]
            )  # Взяли номер строки самой близкой к центру из списка который сравнивали ранее
            line_end = data[new_line_2 - 1]  # Строку которую мы добавляем
            list_2.append(str(new_line_2 - 1))
            option_2_line += f';{str(new_line_2 - 1)}'

            list_1 = option_1_line.split(';')
            new_line_1 = int(list_1[-1])
            line_begin = data[new_line_1]

            if float(line_begin[1]) <= 0 or (float(line_end[1])) >= 0:
                """Сошлись к центру  ---0---^"""
                flag_new_pair, message, name_1, name_2, trash_1, trash_2 = converged_to_the_center(
                    model_m, pair, line_begin, line_end)

            else:
                """К центру не сошлись, формируем name_1 и name_2 для вопроса"""
                flag_new_pair = False
                criteria_number = int(line_begin[0])
                criteria_1 = CriterionModification.objects.filter(
                    model_m=model_m).get(number=criteria_number)
                name_1 = f'"{criteria_1.name}"'

                first_line = True
                for row in list_2:
                    if row == '-1':
                        """ ? """
                        _find_winner(model_m, pair)
                        message = get_original_snod_modification_question(
                            model_m)
                        flag_new_pair = True
                    else:
                        criteria_number = data[int(row[0])][0]
                        criteria_2 = CriterionModification.objects.filter(
                            model_m=model_m).get(number=criteria_number)
                        if first_line is True:
                            """Криткрий первый"""
                            name_2 = f'"{criteria_2.name}"'
                            first_line = False
                        else:
                            name_2 = f'{name_2} и "{criteria_2.name}"'

        else:
            """Строка победитель не состоит из 1 критерия"""
            _write_file(f'{option_1_line}|{option_2_line}|=0\n', path)

            list_2 = option_2_line.split(
                ';')  # Разделили строку по разделителю
            new_line_2 = int(
                list_2[-1]
            )  # Взяли номер строки самой близкой к центру из списка который сравнивали ранее
            line_end = data[new_line_2 - 1]

            list_1 = option_1_line.split(';')
            new_line_1 = int(list_1[-1])
            line_begin = data[new_line_1]

            option_2_line = str(new_line_2 - 1)
            option_1_line = str(new_line_1)

            if (float(line_end[1]) < 0) and (float(line_begin[1]) > 0):
                name_1, name_2 = _get_name_1_and_name_2(
                    model_m, line_end, line_begin)

    elif answer == 0:
        """Равноценны"""
        flag_new_pair, message, name_1, name_2, option_1_line, option_2_line = _take_one_criterion_for_each_alternative(
            option_1_line, option_2_line, path, data, model_m, pair)

    else:
        """Важнее преимущество по критерию а2"""

        find_delimeter = option_2_line.find(';')
        if find_delimeter == -1:
            """Строка состоит из одного критерия альтернативы А2"""
            _write_file(f'{option_1_line}|{option_2_line}|=2\n', path)

            list_2 = option_2_line.split(
                ';')  # Разделили строку по разделителю
            new_line_2 = int(
                list_2[-1]
            )  # Взяли номер строки самой близкой к центру из списка который сравнивали ранее
            line_end = data[new_line_2]

            list_1 = option_1_line.split(';')
            new_line_1 = int(list_1[-1])
            line_begin = data[new_line_1 + 1]
            list_1.append(str(new_line_1 + 1))
            option_1_line += f';{str(new_line_1 + 1)}'

            if float(line_begin[1]) <= 0 or (float(line_end[1])) >= 0:
                """Сошлись к центру  ---0---^"""
                flag_new_pair, message, name_1, name_2, trash_1, trash_2 = converged_to_the_center(
                    model_m, pair, line_begin, line_end)

            else:
                """К центру не сошлись, формируем name_1 и name_2 для вопроса"""
                flag_new_pair = False
                criteria_number = int(line_end[0])
                criteria_2 = CriterionModification.objects.filter(
                    model=model_m).get(number=criteria_number)
                name_2 = criteria_2.name

                first_line = True
                for row in list_1:
                    if row == '-1':
                        """ ? """
                        _find_winner(model_m, pair)
                        message = get_original_snod_modification_question(
                            model_m)
                        flag_new_pair = True
                    else:
                        criteria_number = data[int(row[0])][0]
                        criteria_1 = CriterionModification.objects.filter(
                            id_model=model_m).get(number=criteria_number)
                        if first_line is True:
                            """Критерий первый"""
                            name_1 = f'"{criteria_1.name}"'
                            first_line = False
                        else:
                            name_1 = f'{name_1} и "{criteria_1.name}"'

        else:
            """Строка победитель не состоит из 1 критерия"""
            _write_file(f'{option_1_line}|{option_2_line}|=0\n', path)

            list_2 = option_2_line.split(
                ';')  # Разделили строку по разделителю
            new_line_2 = int(
                list_2[-1]
            )  # Взяли номер строки самой близкой к центру из списка который сравнивали ранее
            line_end = data[new_line_2]

            list_1 = option_1_line.split(';')
            new_line_1 = int(list_1[-1])
            line_begin = data[new_line_1 + 1]

            option_2_line = str(new_line_2)
            option_1_line = str(new_line_1 + 1)

            if (float(line_end[1]) < 0) and (float(line_begin[1]) > 0):
                name_1, name_2 = _get_name_1_and_name_2(
                    model_m, line_end, line_begin)

    try:
        if message['flag_find_winner'] == 1:
            """ Был найден победитель"""

            quasi_max_order = ModificationOption.objects.filter(
                model_m=model_m).aggregate(Max('quasi_order_original_snod')
                                           )['quasi_order_original_snod__max']
            ModelModification.objects.filter(id=model_id).update(
                quasi_max_order_snod=quasi_max_order)
            # fix_quasi_order_snod(model_id)
            # get_graph_snod.delay(model_id)
            return message
    except:
        pass

    if name_1 == '' or name_2 == '':
        _find_winner(model_m, pair)
        message = get_original_snod_modification_question(model_m)

    elif flag_new_pair is False:

        question = f'Преимущество по критерию: {name_1} важнее чем преимущество по критерию: {name_2} ?'
        message = {
            'question': question,
            'option_1': option_1,
            'option_2': option_2,
            'option_1_line': option_1_line,
            'option_2_line': option_2_line,
            'model': model_m.id,
            'flag_find_winner': 0
        }

    elif message is None:
        message = get_original_snod_modification_question(model_m)

    return message