Geometric Centralities and Betweenness in Rust

Matteo Zagheno (987403)

Relatore: Prof. Sebastiano Vigna

Laurea Triennale in Informatica

Università degli Studi di Milano

Centralità

Centralità

Assegnare ai nodi un valore che ne determina
l’importanza all’interno del grafo

WebGraph

  • Compressione e analisi in-memory di grafi di
    grandi dimensioni

  • Sviluppato originariamente in Java

  • Nuova versione in Rust

WebGraph

Rust

Rust

  • Compila in codice nativo

  • Astrazioni a costo zero

  • Immutabilità di default
  • Gestione automatica della memoria senza garbage collector
  • Safety (Memory e Thread)

Obiettivo del lavoro

Progettazione e implementazione di algoritmi per il calcolo delle centralità geometriche e betwenness in Rust nel contesto del framework WebGraph

Centralità geometriche

Centralità Geometriche

Centralità che dipendono solamente dal numero di nodi presenti a ogni distanza

Esempio: Harmonic

H_C (x) = \sum_{y \in G}\frac{1}{\displaystyle{d(x, y)}}

Come calcolarle

Come calcolarle

Eseguiamo una BFS a partire dal nodo di cui vogliamo calcolare la centralità e per ogni nodo raggiungibile applichiamo la formula

Due approcci:

  • Sequenziale
  • Parallelo

BFS sequenziale

C

B

D

E

F

G

A

\begin{align*} +\frac{1}{2} \times 4 \end{align*}
\begin{align*} +\frac{1}{1} \times 2 \end{align*}
\begin{align*} +\frac{1}{1} \end{align*}
\begin{align*} +\frac{1}{1} \end{align*}
\begin{align*} +\frac{1}{2} \end{align*}
\begin{align*} +\frac{1}{2} \end{align*}
\begin{align*} +\frac{1}{2} \end{align*}
\begin{align*} +\frac{1}{2} \end{align*}
= 4
H_C (x) = \sum_{y \in G}\frac{1}{\displaystyle{d(x, y)}}
H_C (x) =

A

B

C

H_C (x) = \sum_{y \in G}\frac{1}{\displaystyle{d(x, y)}}

BFS parallela

B

C

G

F

D

E

\begin{align*} \frac{1}{1} \times 2 \end{align*}
H_C(x) =

BFS parallela

H_C (x) = \sum_{y \in G}\frac{1}{\displaystyle{d(x, y)}}

BFS parallela

G

F

D

E

H

L

I

M

O

J

K

N

\begin{align*} \frac{1}{1} \times 2 \end{align*}
+ \begin{align*} \frac{1}{2} \times 4 \end{align*}
+ \begin{align*} \frac{1}{3} \times 8 \end{align*}
H_C(x) =
H_C (x) = \sum_{y \in G}\frac{1}{\displaystyle{d(x, y)}}

Approccio parallelo

  • BFS Parallela per singolo nodo
  • N BFS Sequenziali per tutti i nodi

Parallelizzazione

Thread 0

Thread 1

Thread 2

Thread 3

0

1

2

3

Prossimi vertici:

Parallelizzazione

1

2

3

Prossimi vertici:

4

0

BFS Sequenziale

Thread 0

Thread 1

Thread 2

Thread 3

Parallelizzazione

1

2

3

Prossimi vertici:

4

5

BFS Sequenziale

BFS Sequenziale

0

Thread 0

Thread 1

Thread 2

Thread 3

Parallelizzazione

1

2

3

Prossimi vertici:

4

5

6

0

BFS Sequenziale

BFS Sequenziale

BFS Sequenziale

Thread 0

Thread 1

Thread 2

Thread 3

Parallelizzazione

1

2

3

Prossimi vertici:

4

5

6

BFS Sequenziale

BFS Sequenziale

BFS Sequenziale

BFS Sequenziale

0

Thread 0

Thread 1

Thread 2

Thread 3

Parallelizzazione

2

3

Prossimi vertici:

4

5

6

BFS Sequenziale

BFS Sequenziale

BFS Sequenziale

BFS Sequenziale

0

Thread 0

Thread 1

Thread 2

Thread 3

Parallelizzazione

2

3

Prossimi vertici:

4

5

6

BFS Sequenziale

BFS Sequenziale

BFS Sequenziale

BFS Sequenziale

Thread 0

Thread 1

Thread 2

Thread 3

Parallelizzazione

3

Prossimi vertici:

4

5

6

BFS Sequenziale

BFS Sequenziale

BFS Sequenziale

BFS Sequenziale

Thread 0

Thread 1

Thread 2

Thread 3

Compute Custom

#[derive(Clone, Default)]
struct CustomGeomCentralityResult {

}


let mut res: Box<[CustomGeomCentralityResult]> = geometric::compute_custom(&graph, threads,
  |n: &mut CustomGeomCentralityResult, distance, num_of_nodes| {
  
  }
);

Compute Custom

#[derive(Clone, Default)]
struct CustomGeomCentralityResult {
  harmonic: f64,
}


let mut res: Box<[CustomGeomCentralityResult]> = geometric::compute_custom(&graph, threads,
  |n: &mut CustomGeomCentralityResult, distance, num_of_nodes| {
    n.harmonic += (1f64 / distance as f64) * num_of_nodes as f64;
  }
);
H_C (x) = \sum_{y \in G}\frac{1}{\displaystyle{d(y, x)}}

Compute Custom

#[derive(Clone, Default)]
struct CustomGeomCentralityResult {
  closeness: f64,
  harmonic: f64,
}

let mut res: Box<[CustomGeomCentralityResult]> = geometric::compute_custom(&graph, threads,
  |n: &mut CustomGeomCentralityResult, distance, num_of_nodes| {
    n.closeness += (num_of_nodes * distance) as f64;
    n.harmonic += (1f64 / distance as f64) * num_of_nodes as f64;
  }
);

for item: &mut CustomGeomCentralityResult in &mut res {
  item.closeness = 1.0 / item.closeness;
}
H_C (x) = \sum_{y \in G}\frac{1}{\displaystyle{d(x, y)}}
C_C (x) = \frac{1}{\sum_{y \in G}\displaystyle{d(x, y)}}

Betweenness

Betweenness

Quantifica quante volte un nodo si trova sul percorso più breve tra altri due nodi nel grafo

Betweenness

Quantifica quante volte un nodo si trova sul percorso più breve tra altri due nodi nel grafo

C_B (x) = \sum_{y \neq x \neq z} \frac{\sigma_{y z}(x)}{\sigma_{y z}}

Algoritmo di Brandes

  • Single-source shortest paths (BFS)
  • Backpropagation
  • Parallelizzabile

Per ogni nodo:

Risultati per le centralità geometriche

Decremento ~70%

Risultati per centralità geometriche singole

Decremento tra 30 e 70%

Risultati per la betweenness

Decremento ~30%

Grazie per l'attenzione

Slide Tesi

By Matteo Zagheno

Slide Tesi

Gemetric Centralities and Betweenness in Rust: Tesi di laurea triennale Matteo Zagheno 987403

  • 73