Initial commit: планирование эксперимента и оптимизация смесей

This commit is contained in:
2026-07-23 15:12:32 +05:00
commit 025421193d
17 changed files with 1634 additions and 0 deletions
+156
View File
@@ -0,0 +1,156 @@
# response.py
"""
Ввод и управление откликами эксперимента.
"""
from core.fs import save_project_partial
from core.table_io import handle_table_output
def response_menu(design, responses):
if not design.plan:
print("План эксперимента пуст. Сначала создайте или загрузите дизайн.")
input("Нажмите Enter для продолжения...")
return responses
num_experiments = len(design.plan)
while True:
print("\n" + "=" * 50)
print("ВВОД ЗНАЧЕНИЙ ОТКЛИКА")
print(f"Количество опытов: {num_experiments}")
print("1. Показать все отклики")
print("2. Добавить новый отклик")
print("3. Редактировать отклик")
print("4. Переименовать отклик")
print("5. Удалить отклик")
print("6. Сохранить отклики в проект")
print("(Enter - выход в главное меню)")
print("=" * 50)
choice = input("Выберите пункт: ").strip()
if choice == "":
break
if choice == "1":
if not responses:
print("Отклики не введены.")
continue
headers = ["Опыт"] + [resp["name"] for resp in responses]
rows = []
for i in range(num_experiments):
row = [str(i + 1)]
for resp in responses:
values = resp["values"]
if i < len(values):
row.append(f"{values[i]:.3f}")
else:
row.append("")
rows.append(row)
handle_table_output(headers, rows, title="Таблица откликов")
elif choice == "2":
name = input("Введите название нового отклика: ").strip()
if not name:
print("Название не может быть пустым.")
continue
if any(r["name"].lower() == name.lower() for r in responses):
print("Отклик с таким названием уже существует.")
continue
print(f"Введите {num_experiments} значений для отклика '{name}':")
values = []
for i in range(num_experiments):
while True:
val = input(f" Опыт {i+1}: ").strip()
try:
values.append(float(val))
break
except ValueError:
print("Введите число.")
responses.append({"name": name, "values": values})
print(f"Отклик '{name}' добавлен.")
elif choice == "3":
if not responses:
print("Нет откликов для редактирования.")
continue
print("Список откликов:")
for idx, resp in enumerate(responses, start=1):
print(f"{idx}. {resp['name']} (значений: {len(resp['values'])})")
try:
idx = int(input("Выберите номер отклика для редактирования: ")) - 1
if idx < 0 or idx >= len(responses):
print("Неверный номер.")
continue
resp = responses[idx]
print(f"Редактирование отклика '{resp['name']}'. Введите новые значения.")
new_values = []
for i in range(num_experiments):
while True:
val = input(f" Опыт {i+1} (было {resp['values'][i] if i < len(resp['values']) else ''}): ").strip()
if val == "":
if i < len(resp['values']):
new_values.append(resp['values'][i])
else:
print("Значение обязательно.")
continue
break
try:
new_values.append(float(val))
break
except ValueError:
print("Введите число.")
resp["values"] = new_values
print(f"Отклик '{resp['name']}' обновлён.")
except ValueError:
print("Ошибка ввода.")
elif choice == "4":
if not responses:
print("Нет откликов для переименования.")
continue
print("Список откликов:")
for idx, resp in enumerate(responses, start=1):
print(f"{idx}. {resp['name']}")
try:
idx = int(input("Выберите номер отклика для переименования: ")) - 1
if idx < 0 or idx >= len(responses):
print("Неверный номер.")
continue
new_name = input(f"Введите новое название для '{responses[idx]['name']}': ").strip()
if not new_name:
print("Название не может быть пустым.")
continue
if any(r["name"].lower() == new_name.lower() for r in responses if r != responses[idx]):
print("Отклик с таким названием уже существует.")
continue
old_name = responses[idx]["name"]
responses[idx]["name"] = new_name
print(f"Отклик '{old_name}' переименован в '{new_name}'.")
except ValueError:
print("Ошибка ввода.")
elif choice == "5":
if not responses:
print("Нет откликов для удаления.")
continue
print("Список откликов:")
for idx, resp in enumerate(responses, start=1):
print(f"{idx}. {resp['name']} (значений: {len(resp['values'])})")
try:
idx = int(input("Выберите номер отклика для удаления: ")) - 1
if idx < 0 or idx >= len(responses):
print("Неверный номер.")
continue
deleted = responses.pop(idx)
print(f"Отклик '{deleted['name']}' удалён.")
except ValueError:
print("Ошибка ввода.")
elif choice == "6":
save_project_partial(responses=responses)
print("Отклики сохранены в проект.")
else:
print("Неверный пункт.")
return responses