add report Sergej Naryshev - #27
Conversation
|
|
||
| В задачах анализа графов и обработки больших разрежённых матриц ключевую роль играет выбор эффективного внутреннего представления данных. Традиционные форматы вроде CSR (Compressed Sparse Row) обеспечивают высокую производительность статических операций, но плохо приспособлены к рекурсивным алгоритмам, характерным для функционального программирования. Альтернативный подход~--- использование деревьев квадрантов (quadtree), которые позволяют единообразно работать с данными на разных уровнях вложенности и естественным образом реализуют разрежённое хранение. | ||
|
|
||
| Библиотека QTreeFSharp~--- это реализация разрежённых векторов и матриц на основе квадродеревьев на языке F\#. Она предоставляет базовый набор операций линейной алгебры и графовых алгоритмов в парадигме Graph\-BLAS. В рамках данной работы выполнялось расширение функциональности библиотеки: добавлены операции фильтрации и кванторные проверки, необходимые для реализации более сложных графовых алгоритмов (например, выделение подмножества вершин по условию или проверка свойств графа без полного перебора). |
|
|
||
| \textbf{Целью работы} является доработка репозитория QTreeFSharp путём реализации трёх групп операций над разрежёнными структурами данных: фильтрации по предикату, проверки существования элемента и проверки всеобщности. | ||
|
|
||
| Для достижения цели были поставлены следующие задачи: |
There was a problem hiding this comment.
не совсем понял смысл
точка вместо запятой или цель сформулировать кратко?
|
|
||
| \section{Особенности реализации} | ||
|
|
||
| \subsection{Схема работы с квадродеревьями} |
There was a problem hiding this comment.
Не мельчите с подсекйиями. Не нужны они. Просто хороший связаннй текст на несколько абзацев.
|
|
||
| \subsection{Фильтрация} | ||
|
|
||
| \texttt{filter} принимает структуру данных (вектор или матрицу) и функцию-предикат, после чего строит новую структуру, куда попадают только те элементы, для которых предикат вернул \texttt{true}. Пустые листы (\texttt{Dummy}) игнорируются. Рекурсивный спуск по дереву позволяет обрабатывать только занятые узлы, а конденсация на выходе обеспечивает компактность результата. Это особенно важно для разрежённых данных, где большая часть элементов не удовлетворяет предикату~--- итоговая структура также остаётся разрежённой. |
There was a problem hiding this comment.
А вот это нтересно. Как вообще определён фильтр на разреженной структуре?
There was a problem hiding this comment.
для фильтра я решил сделать обход и для каждого ненулевого про проверяется предикат, за тем после этого происходит сжатие одинаковых поэтому компактность сохраняется, я ещё думал про более ещё более жёсткое сжатие, но тогда прийдётся сдвигать индексы что приведёт к тому что, это будет другая структура.
Если вы считаете иначе, готов выслушать и поменять
|
|
||
| \subsection{Кванторные операции с коротким замыканием} | ||
|
|
||
| \texttt{exists} проверяет, встречается ли хотя бы один элемент, удовлетворяющий предикату (\texttt{||} по всем значениям). Если такой элемент найден, дальнейший обход дерева прекращается. \texttt{forall} проверяет, что все элементы удовлетворяют предикату (\texttt{\&\&} по всем значениям)~--- при нахождении первого неподходящего элемента обход также завершается досрочно. Короткое замыкание реализовано на уровне рекурсивного обхода: если левое поддерево уже дало ответ, правое не просматривается. В худшем случае (предикат истинен для всех элементов в exists или ни для одного в forall) выполняется полный обход, что эквивалентно filter. |
There was a problem hiding this comment.
Почему это не частные случаи какого-нибудь find?
There was a problem hiding this comment.
здесь всё таки проверяется, что какое то значение выполняется для хотя бы одного или для всех одновременно и возвращается булевое значение
There was a problem hiding this comment.
Для какого-нибудь --- это прям точно find. Для всех --- это отрицание find.
|
|
||
| \section{Экспериментальная оценка} | ||
|
|
||
| \subsection{Условия проведения замеров} |
|
|
||
| Генерировались два набора синтетических данных: | ||
| \begin{itemize} | ||
| \item \textbf{Dense}~--- структуры, целиком заполненные единицами (максимальная нагрузка на квадродерево); |
| \end{tabular} | ||
| \end{table} | ||
|
|
||
| Сравнение показывает, что разрежённые векторы обрабатываются быстрее плотных в 2.5--3 раза, разрежённые матрицы~--- в 9--12 раз. Это объясняется меньшим числом обходимых узлов квадродерева. |
|
|
||
| Разница между exists и forall находится в пределах погрешности, поскольку при выбранных условиях (предикат верен для всех или ни для одного элемента) короткое замыкание не срабатывает, и оба метода выполняют полный обход. На реальных данных с неравномерным распределением значений эффект от короткого замыкания будет заметнее. | ||
|
|
||
| Разрежённое представление даёт существенный выигрыш во времени: для векторов~--- до 3 раз, для матриц~--- до 15 раз. Чем больше размер структуры, тем значимее становится разница, так как квадродерево эффективнее сжимает большие разрежённые данные. |
| \item Реализованы операции \texttt{filter}, \texttt{exists} и \texttt{forall} для разрежённых векторов и матриц на основе квадродеревьев. | ||
| \item В \texttt{exists} и \texttt{forall} внедрено короткое замыкание, позволяющее завершать обход досрочно. | ||
| \item Написаны 64 модульных теста для проверки корректности реализованных функций. | ||
| \item Проведены бенчмарки, которые подтверждают эффективность разрежённого представления: выигрыш по сравнению с плотным составляет до 3 раз для векторов и до 15 раз для матриц. |
There was a problem hiding this comment.
хорошо, добавил сравнения с ожидаемой сложностью данных функций, если вы это имели ввиду, если нужны какие то другие результаты, подскажите какие именно
There was a problem hiding this comment.
Нет. Я имел ввиду, что у замеров должна быть цель. Должен быть смысл. А с теоретической сложность ю так не работатет без соответствующего математического аппарата.
| \toprule | ||
| Метод & N=64 & N=256 & N=1024 \\ | ||
| \midrule | ||
| VectorDense & 2.8 & 11.5 & 57.1 \\ |
There was a problem hiding this comment.
Точность везде должна быть одинакова.
| \end{tabular} | ||
| \end{table} | ||
|
|
||
| Рост времени \texttt{filter} от N=256 к N=1024 составляет ≈5× для векторов (близко к $O(N)$) и ≈17× для плотной матрицы (близко к $O(N^2)$). Разрежённая матрица растёт медленнее, так как число ненулевых элементов линейно по N, а не квадратично. |
There was a problem hiding this comment.
На сколько "близко"? Километр --- это достаточно близко?
| \label{fig:filters} | ||
| \end{figure} | ||
|
|
||
| Результаты \texttt{exists} и \texttt{forall} практически совпадают: при выбранных условиях short-circuit не срабатывает (худший случай), поэтому время соответствует $O(N^2)$ на плотных матрицах и $O(N+nnz)$ на разрежённых. В лучшем случае (первый же элемент удовлетворяет \texttt{exists} или не удовлетворяет \texttt{forall}) сложность составит $O(1)$. Выигрыш разрежённого представления (до 3× для векторов, до 15× для матриц) согласуется с отношением числа узлов полного дерева к числу занятых листьев. |
There was a problem hiding this comment.
А как Вы выяснили, что оно квадрату соответствует?
gsvgit
left a comment
There was a problem hiding this comment.
А теперь по существу. То, что Вы сделали --- странно. А всё потому, что надо было заранее обсуждать результаты. Видимо, до сентября.
No description provided.