use crate::{
db::api::{
state::{GenericNodeState, TypedNodeState},
view::StaticGraphViewOps,
},
prelude::*,
};
use rayon::prelude::*;
use serde::{Deserialize, Serialize};
#[derive(Clone, PartialEq, Serialize, Deserialize, Debug)]
pub struct CentralityScore {
#[serde(rename = "degree_centrality")]
pub score: f64,
}
pub fn degree_centrality<G: StaticGraphViewOps>(
g: &G,
) -> TypedNodeState<'static, CentralityScore, G> {
let max_degree = match g.nodes().degree().max() {
None => return TypedNodeState::new(GenericNodeState::new_empty(g.clone())),
Some(v) => v,
};
let values: Vec<CentralityScore> = g
.nodes()
.degree()
.into_par_iter_values()
.map(|v| CentralityScore {
score: (v as f64) / max_degree as f64,
})
.collect();
TypedNodeState::new(GenericNodeState::new_from_eval(g.clone(), values, None))
}