-
Notifications
You must be signed in to change notification settings - Fork 0
Дерево задач
Дерево задач - это граф, который показывает, какие задачи являются похожими.
Похожие задачи ищется при помощи класса SimilarProblemsFinder (#205). Ему передаётся массив задач, и он возвращает список упорядоченных пар похожих задач (первой в паре идёт та задача, которая идёт раньше в списке задач). Также он может вернуть "похожесть" двух задач (число от 0 до 1) и количество одинаковых тестов. Задачи считаются похожими, если их "похожесть" не меньше 0.5.
Далее строится дерево задач (#236) - класс, который для каждой задачи находит наиболее похожую на неё из предыдущих. Он может по задаче вернуть наиболее похожую на неё, а также их "похожесть" и количество одинаковых тестов (#304).
Рисование производится при помощи класса Image (#258). Используется библиотека PIL.
Класс TreeDrawer (#256) принимает ProblemsTree и создаёт изображение дерева задач. Его можно сохранить в файл.
- Задачи размещаются на изображении
- Метод _locate_problems должен создать словарь self.problem_coords (по задач -её координаты) и массив пар self.problems_and_coords, содержащий ту же инфоормацию.
- Сейчас задачи располагаются по контестам, контесты сверху вниз.
- Нужно будет расположить задачи по-другому: группировка по контестам, параллелям, сменам. Нужно будет получать откуда-нибудь (из конфига?) информацию о контестах, сменах, параллелях, и передавать их в TreeDrawer (#305).
- Линии размещаются на изображении
- Метод _locate_lines должен создать список self.lines, содержащий для каждой линии массив последовательных точек.
- Для размещения линии используется следующий алгоритм: текущая точка двигается по плоскости, существует сила притяжения к цели и сила отталкивания от задач и от других линий (но пересечения допустимы).
- Нужно добавить стрелочки на концах и реализовать разные цвета линий: зелёным цветом - для одинаковых задач, шкала от жёлтого до красного - понижение "похожести" (#306).
- Затем вызывается _draw_tree, который рисует дерево по массивам, которые были созданы методами _locate_problems и locate_lines.
- Нужно дописать метод _draw_problem, который рисует задачу: добавить название задачи и контеста, цвет в зависимости от "похожести" на родительскую задачу, информацию о родительскй задаче, количество тестов (#307).