Matteo Zagheno (987403)
Relatore: Prof. Sebastiano Vigna
Laurea Triennale in Informatica
Università degli Studi di Milano
Assegnare ai nodi un valore che ne determina
l’importanza all’interno del grafo
Compressione e analisi in-memory di grafi di
grandi dimensioni
Sviluppato originariamente in Java
Compila in codice nativo
Astrazioni a costo zero
Progettazione e implementazione di algoritmi per il calcolo delle centralità geometriche e betwenness in Rust nel contesto del framework WebGraph
Centralità che dipendono solamente dal numero di nodi presenti a ogni distanza
Esempio: Harmonic
Eseguiamo una BFS a partire dal nodo di cui vogliamo calcolare la centralità e per ogni nodo raggiungibile applichiamo la formula
Due approcci:
C
B
•
•
D
E
F
G
A
•
A
B
C
B
C
G
F
D
E
G
F
D
E
H
L
I
M
O
J
K
N
Thread 0
Thread 1
Thread 2
Thread 3
0
1
2
3
Prossimi vertici:
1
2
3
Prossimi vertici:
4
0
BFS Sequenziale
Thread 0
Thread 1
Thread 2
Thread 3
1
2
3
Prossimi vertici:
4
5
BFS Sequenziale
BFS Sequenziale
0
Thread 0
Thread 1
Thread 2
Thread 3
1
2
3
Prossimi vertici:
4
5
6
0
BFS Sequenziale
BFS Sequenziale
BFS Sequenziale
Thread 0
Thread 1
Thread 2
Thread 3
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
2
3
Prossimi vertici:
4
5
6
BFS Sequenziale
BFS Sequenziale
BFS Sequenziale
BFS Sequenziale
0
Thread 0
Thread 1
Thread 2
Thread 3
2
3
Prossimi vertici:
4
5
6
BFS Sequenziale
BFS Sequenziale
BFS Sequenziale
BFS Sequenziale
Thread 0
Thread 1
Thread 2
Thread 3
3
Prossimi vertici:
4
5
6
BFS Sequenziale
BFS Sequenziale
BFS Sequenziale
BFS Sequenziale
Thread 0
Thread 1
Thread 2
Thread 3
#[derive(Clone, Default)]
struct CustomGeomCentralityResult {
}
let mut res: Box<[CustomGeomCentralityResult]> = geometric::compute_custom(&graph, threads,
|n: &mut CustomGeomCentralityResult, distance, num_of_nodes| {
}
);#[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;
}
);#[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;
}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
Algoritmo di Brandes
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