Skip to content

Commit ac2259b

Browse files
committed
Финальыне правки: инструкция по установке, ссылки на примеры кода.
1 parent 61b625a commit ac2259b

File tree

1 file changed

+34
-15
lines changed

1 file changed

+34
-15
lines changed

README.md

Lines changed: 34 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,27 @@
11
# PageRankBenchmark
2-
Stand for PageRank algorithm benchmark
2+
Демонстрация использования алгоритма "PageRank" на графе со сложными атрибутами вершин и ребёр.
3+
# Руководство к запуску
4+
## Установка зависимостей
5+
```bash
6+
sudo apt install ccache
7+
sudo apt install ninja-build
8+
```
9+
10+
## Сборка проекта
11+
```bash
12+
git clone https://github.com/SparseLinearAlgebra/PageRankBenchmark.git
13+
cd PageRankBenchmark
14+
git submodule init
15+
git submodule update —recursive
16+
make build
17+
```
318

19+
## Запуск примера
20+
```
21+
./build/main
22+
```
423
# Минимальный пример
24+
Полный код разбираемого примера можно увидеть в [файле](./src/main.c).
525

626
Цель примера --- показать, как в рамках GraphBLAS можно работать со сложными атрибутами вершин и рёбер графа.
727

@@ -17,7 +37,7 @@ Stand for PageRank algorithm benchmark
1737

1838
Пусть будут следующие типы карт: МИР, VISA, MASTERCARD.
1939

20-
При этом рёбра типа "Перевод" в качестве атрибутов сожержат общую сумму и "количество транзакций".
40+
При этом рёбра типа "Перевод" в качестве атрибутов содержат общую сумму и "количество транзакций".
2141
Рёбра типа "Владеет" не имеют атрибутов.
2242

2343
Для примера возьмём следующий граф.
@@ -26,7 +46,6 @@ Stand for PageRank algorithm benchmark
2646

2747
Хотим выбрать по некоторому критерию пользователей и их карты, а затем для анализа переводов хотим посчитать PageRank на подграфе, заданном переводами между отобранными картами.
2848
Выбрать хотим все карты системы "МИР", которыми владеют люди старше заданного возраста. Покажем, как это можно сделать, используя матрично-векторные операции, в частности [GraphBLAS](https://github.com/GraphBLAS).
29-
Полный код разбираемого примера мрожно увидеть в файле [!!!!](!!!!).
3049

3150
GraphBLAS позволяет в качестве атрибутов использовать пользовательские типы (фиксированных размеров), потому объявим необходимый нам набор типов.
3251
```c
@@ -68,9 +87,9 @@ typedef struct
6887
```
6988

7089
Граф представлен как набор матриц и векторов: по одной матрице на каждый тип рёбер и по одному вектору на каждый тип вершин.
71-
Матрицы и вектора в большинстве случаев будут разреженными и мы будем использовать символ '$.$' для обозначения отсутсвующего элемента.
90+
Матрицы и вектора в большинстве случаев будут разреженными и мы будем использовать символ '$.$' для обозначения отсутствующего элемента.
7291
Считаем при этом, что все вершины, вне зависимости от типа, занумерованы с 0 подряд (id вершин на рисунке).
73-
Таким образом, нам понядобятся две матрицы:
92+
Таким образом, нам понадобятся две матрицы:
7493

7594
$$
7695
\texttt{TX-Edges}=
@@ -124,7 +143,7 @@ $$
124143
Скажем, нас будут интересовать пользователи старше 30 лет.
125144
Для этого в GraphBLAS есть функция ```Select```, которая фильтрует коллекции, используя функцию-предикат принимаемую в качестве аргумента.
126145

127-
Так как нам предстоит работать с пользовательскими типами, то предётся написать собственный предикат.
146+
Так как нам предстоит работать с пользовательскими типами, то придётся написать собственный предикат.
128147

129148
```c
130149
void check_user_age(bool *z, const User *x, GrB_Index _i, GrB_Index _j, const uint8_t *y)
@@ -136,7 +155,7 @@ void check_user_age(bool *z, const User *x, GrB_Index _i, GrB_Index _j, const ui
136155
Два дополнительных параметра типа ```GrB_Index``` позволяют, при необходимости, использовать в фильтре координаты рассматриваемого элемента.
137156
138157
Для того, чтобы выбрать карты, принадлежащие выбранным пользователям, нам необходимо получить "концы" рёбер типа Owns, исходящие из выбранных пользователей.
139-
Чтобы сделать это, выполним один шаг обхода в ширину, который в терминах линейной алгебры выражается через умноженеи вектора текущих вершин на матрицу смежности.
158+
Чтобы сделать это, выполним один шаг обхода в ширину, который в терминах линейной алгебры выражается через умножение вектора текущих вершин на матрицу смежности.
140159
Текущие вершины в нашем случае --- выбранные пользователи.
141160
То есть нам необходимо вычислить следующее произведение.
142161
@@ -178,7 +197,7 @@ $$
178197
179198
Мы получили не совсем карты, но вектор, который указывает, какие карты нас интересуют.
180199
Вспомним, что мы хотим взять только карты "МИР".
181-
Для этого снова будем использовать Select, а полученный вектор $\texttt{Filtered-Cards}$ будем использовать как маску, чтобы дополнительно тфильтровать результат.
200+
Для этого снова будем использовать Select, а полученный вектор $\texttt{Filtered-Cards}$ будем использовать как маску, чтобы дополнительно отфильтровать результат.
182201
183202
184203
Чтобы получить переводы только между отобранными картами, воспользуемся тем фактом, что выбор исходящих рёбер, инцидентных заданному множеству вершин --- это умножение матрицы смежности на диагональную матрицу, в которой ненулевые элементы на местах интересующих нас вершин, слева.
@@ -261,14 +280,14 @@ $$
261280
262281
В качестве конкретных реализаций для $+$ можно взять логическое "И", а в качестве $*$ операцию $\textit{second}$ (вернуть второй элемент из пары).
263282
264-
Для $\otimes_2$ ситуация аналогияная,
265-
Необходимо только проследить за тем, в какие моменты надо брать первый элемент из пары, а в какие вотрой, чтобы в результате получилась матрица с элементами типа $\texttt{EdgeTX}$
283+
Для $\otimes_2$ ситуация аналогичная,
284+
Необходимо только проследить за тем, в какие моменты надо брать первый элемент из пары, а в какие второй, чтобы в результате получилась матрица с элементами типа $\texttt{EdgeTX}$
266285
267286
Подграф готов.
268-
Теперь неорбходимо сконструировать матрицу, по которой непосредственно будем считать PageRank.
287+
Теперь необходимо сконструировать матрицу, по которой непосредственно будем считать PageRank.
269288
Сейчас метки рёбер --- структуры, хранящие информацию о переводах, а мы хотим получить одно число.
270289
При этом важно, чтобы сумма весов всех исходящих рёбер была равна единице.
271-
Для примера действовать будем следующим образом: возьмём "средний размер транзакции" (вычислим как $\frac{\textit{Sum}}{\textit{Count}}$), поделим на 1000 (на всякий случай, чтобы избежать слишком больших знчений) и затем построчно примерним Softmax.
290+
Для примера действовать будем следующим образом: возьмём "средний размер транзакции" (вычислим как $\frac{\textit{Sum}}{\textit{Count}}$), поделим на 1000 (на всякий случай, чтобы избежать слишком больших значений) и затем построчно применим Softmax.
272291
Иными словами, будем использовать идею функции Softmax, которая задаётся следующим образом.
273292
274293
$$
@@ -283,10 +302,10 @@ $$
283302
$$
284303
285304
Вычисления построим следующим образом. Сперва выполним редукцию по колонкам с использованием функции $f$: таким образом получим знаменатель дроби.
286-
После этого сконструируем две квадратные матрицы: в одной нулевой столбец --- это получанный вектор, а остальные нули, в другой --- нулевая строка --- единицы, остальное --- нули.
305+
После этого сконструируем две квадратные матрицы: в одной нулевой столбец --- это полученный вектор, а остальные нули, в другой --- нулевая строка --- единицы, остальное --- нули.
287306
Перемножим эти две матрицы, использую исходную матрицу $\texttt{Filtered-Transactions}$ в качестве маски.
288307
Таким образом получим матрицу, в которой знаменатель стоит на необходимых местах.
289-
Также нам нужна будет матрица, содержащая числители дробей (получается поэлементным примерением соответствующей функции к $\texttt{Filtered-Transactions}$)
308+
Также нам нужна будет матрица, содержащая числители дробей (получается поэлементным применением соответствующей функции к $\texttt{Filtered-Transactions}$)
290309
После чего поэлементно поделим эти две матрицы.
291310
292-
Далее на полученной матрице запускаем [классический алгоритм PageRank](!!!) (правда, без "телепортации" в несвязанные вершины), который в терминах линейной алгебры реалищуется по определению: итеративное умножение исходной матрицы на вектор.
311+
Далее на полученной матрице запускаем [классический алгоритм PageRank](./src/main.c#L190) (правда, без "телепортации" в несвязанные вершины), который в терминах линейной алгебры реализуется по определению: итеративное умножение исходной матрицы на вектор.

0 commit comments

Comments
 (0)