Extract cluster ends in more easy-to-use way
This commit is contained in:
parent
9c73e691a8
commit
a12f79d864
1 changed files with 44 additions and 18 deletions
|
|
@ -90,6 +90,34 @@ fn find_clusters(data: &AdjacencyList<PageInfo, LinkInfo>, forward: &PageMap) ->
|
||||||
cluster
|
cluster
|
||||||
}
|
}
|
||||||
|
|
||||||
|
enum Cluster {
|
||||||
|
DeadEnd(u32),
|
||||||
|
Loop(Vec<u32>),
|
||||||
|
}
|
||||||
|
|
||||||
|
fn resolve_clusters(forward: &PageMap, cluster: &PageMap) -> HashMap<u32, Cluster> {
|
||||||
|
let mut result = HashMap::new();
|
||||||
|
for canonical in cluster.0.iter().copied().collect::<HashSet<_>>() {
|
||||||
|
if forward.get(canonical) == u32::MAX {
|
||||||
|
result.insert(canonical, Cluster::DeadEnd(canonical));
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
let mut members = vec![];
|
||||||
|
let mut current = canonical;
|
||||||
|
loop {
|
||||||
|
members.push(current);
|
||||||
|
current = forward.get(current);
|
||||||
|
if current == canonical {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
result.insert(canonical, Cluster::Loop(members));
|
||||||
|
}
|
||||||
|
|
||||||
|
result
|
||||||
|
}
|
||||||
|
|
||||||
fn print_forward_edges_as_json(
|
fn print_forward_edges_as_json(
|
||||||
data: &AdjacencyList<PageInfo, LinkInfo>,
|
data: &AdjacencyList<PageInfo, LinkInfo>,
|
||||||
forward: &PageMap,
|
forward: &PageMap,
|
||||||
|
|
@ -173,26 +201,24 @@ pub fn run(datafile: &Path, subcmd: PhilosophyGameCmd) -> io::Result<()> {
|
||||||
|
|
||||||
// Print clusters
|
// Print clusters
|
||||||
assert!(subcmd == PhilosophyGameCmd::Cluster);
|
assert!(subcmd == PhilosophyGameCmd::Cluster);
|
||||||
|
let resolved = resolve_clusters(&forward, &cluster);
|
||||||
for (canonical, size) in cluster_by_size {
|
for (canonical, size) in cluster_by_size {
|
||||||
if forward.get(canonical) == u32::MAX {
|
match resolved.get(&canonical).unwrap() {
|
||||||
let title = &data.page(canonical).data.title;
|
Cluster::DeadEnd(page) => {
|
||||||
|
let title = &data.page(*page).data.title;
|
||||||
println!("Cluster (dead-end, {size}): {title}");
|
println!("Cluster (dead-end, {size}): {title}");
|
||||||
continue;
|
|
||||||
}
|
}
|
||||||
|
Cluster::Loop(pages) => {
|
||||||
println!("Cluster (loop, {size}):");
|
println!("Cluster ({}-loop, {size}):", pages.len());
|
||||||
let mut current = canonical;
|
for page in pages {
|
||||||
loop {
|
let page = data.page(*page);
|
||||||
let page = data.page(current);
|
|
||||||
let title = &page.data.title;
|
let title = &page.data.title;
|
||||||
if page.data.redirect {
|
if page.data.redirect {
|
||||||
println!(" v {title}");
|
println!(" v {title}");
|
||||||
} else {
|
} else {
|
||||||
println!(" - {title}");
|
println!(" - {title}");
|
||||||
}
|
}
|
||||||
current = forward.get(current);
|
}
|
||||||
if current == canonical {
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue