Реализация 2-side-BFS с ограничением по максимальной длине при помощи линейной алгебры и библиотек SuiteSparse:GraphBLAS, LAGraph и инструмент для измерения производительности алгоритма
Для сборки выполните:
sudo apt install -y g++ gcc cmake python3 unzip jupyter-notebook &&
git clone https://github.com/georgiy-belyanin/2-side-bfs.git &&
cd 2-side-bfs &&
git submodule init &&
git submodule update &&
./scripts/get-graphblas.sh &&
export GRAPHBLAS_INCLUDE_DIR=`pwd`/graphblas-binaries/include &&
export GRAPHBLAS_LIBRARY=`pwd`/graphblas-binaries/lib/libgraphblas.so &&
mkdir build && cd build && cmake .. -DGRAPHBLAS_INCLUDE_DIR=${GRAPHBLAS_INCLUDE_DIR} -DGRAPHBLAS_LIBRARY=${GRAPHBLAS_LIBRARY} && make -j`nproc` && cd ..
Для конвертации графов из формата csv в mtx используется python скрипт scripts/convert-csv-to-mtx.py
:
python3 ./scripts/convert-csv-to-mtx.py <graph.csv> <graph.mtx> [dictionary.txt]
Словарь соответствия вершина/номер по-умолчанию называется dictionary.txt
Пример использования:
python3 ./scripts/convert-csv-to-mtx.py graph.csv graph.mtx
Для измерения производительности в зависимости от длины можно использовать следующую команду:
./build/two-side-bfs
[-r число запусков для каждой длины (по-умолчанию: 1000)]
[-l наименьшая изучаемая длина пути (по-умолчанию: 2)]
[-m наибольшая изучаемая длина пути (по-умолчанию: 5)]
<graph.mtx>
[results/]
Для каждой из максимальной длин в диапазоне задаваемом аргументами l
и m
будет получен файл по пути results/<макс-длина-пути>.txt
, в файлах построчно содержится время запуска кажддого из запросов.
Пример использования:
./build/two-side-bfs graph.mtx
В консоль для каждой макс. длины при этом будет выведена информация о среднем времени работы, стандартном отклонении, проценте запросов, в которых путь нашёлся и число запросов в секунду
Для детального анализа результатов измерений можно воспользоваться Jupyter-notebook, нужные скрипты находятся в файле plots.ipynb
:
jupyter notebook <results/>
После выполнения команды откроется браузер, в jupyter notebook необходимо выполнить каждую ячейку, сделать это можно выбором Cell > Run All
в тулбаре, или многократным нажатием Shift+Enter
. Отрисованные boxplot появятся внизу файла и станут доступны в директории с результатами с названиями both.png
- boxplot для всех случаев, path-exists.png
- когда путь есть, not-exists.png
- когда пути нет. В Boxplot чёрным выделяется медиана, зелёным - среднее.
Для сборки необходимы:
cmake
- Компилятор
g++
илиclang++
- Библиотека
SuiteSparse:GraphBLAS
- Утилита
unzip
Для установки зависимостей сборки на debian-based дистрибутивах:
apt install -y g++ gcc cmake unzip
Для сборки так же необходимо получить сабмодули:
git submodule init
git submodule update
Дополнительно для запуска некоторых скриптов нужен Python 3
apt install -y python3
Чтобы скачать собранную библиотеку можно воспользоваться скриптом:
./scripts/get-graphblas.sh
Но при сборке библиотеки под конкретную машину время работы может стать заметно меньше: установка SuiteSparse:GraphBLAS.
Для сборки проекта используется CMake, в случае, если SuiteSparse:GraphBLAS не собирался из исходников, выполните из корня репозитория:
# Эти переменные нужны, если GraphBLAS скачивается pre-built
export GRAPHBLAS_INCLUDE_DIR=`pwd`/graphblas-binaries/include
export GRAPHBLAS_LIBRARY=`pwd`/graphblas-binaries/lib/libgraphblas.so
mkdir build && cd build && cmake .. -DGRAPHBLAS_INCLUDE_DIR=${GRAPHBLAS_INCLUDE_DIR} -DGRAPHBLAS_LIBRARY=${GRAPHBLAS_LIBRARY} && make -j`nproc` && cd ..
Если SuiteSparse:GraphBLAS собирался и устанавливался предварительно из исходного кода, достаточно выполнить:
mkdir build && cd build && cmake .. && make -j`nproc` && cd ..