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