use std::collections::BTreeMap;
use crate::partition::LeidenPartition;
pub const CACHE_FILENAME: &str = "cache/partition.json";
pub fn initial_assignment_from_cache(
cached: Option<&LeidenPartition>,
node_count: usize,
) -> Vec<usize> {
let mut assignment: Vec<usize> = (0..node_count).collect();
let cached = match cached {
Some(c) => c,
None => return assignment,
};
let mut community_remap: BTreeMap<usize, usize> = BTreeMap::new();
let mut next_comm = 0usize;
for (&node, &comm) in &cached.assignments {
if node >= node_count {
continue;
}
let remapped = *community_remap.entry(comm).or_insert_with(|| {
let c = next_comm;
next_comm += 1;
c
});
assignment[node] = remapped;
}
let mut used: std::collections::BTreeSet<usize> = community_remap.values().copied().collect();
let mut counter = 0usize;
for (i, slot) in assignment.iter_mut().enumerate().take(node_count) {
if !cached.assignments.contains_key(&i) {
while used.contains(&counter) {
counter += 1;
}
*slot = counter;
used.insert(counter);
counter += 1;
}
}
assignment
}