graph health: fix-categories, cap-degree, link-orphans
Three new tools for structural graph health: - fix-categories: rule-based recategorization fixing core inflation (225 → 26 core nodes). Only identity.md and kent.md stay core; everything else reclassified to tech/obs/gen by file prefix rules. - cap-degree: two-phase degree capping. First prunes weakest Auto edges, then prunes Link edges to high-degree targets (they have alternative paths). Brought max degree from 919 → 50. - link-orphans: connects degree-0/1 nodes to most textually similar connected nodes via cosine similarity. Linked 614 orphans. Also: community detection now filters edges below strength 0.3, preventing weak auto-links from merging unrelated communities. Pipeline updated: consolidate-full now runs link-orphans + cap-degree instead of triangle-close (which was counterproductive — densified hub neighborhoods instead of building bridges). Net effect: Gini 0.754 → 0.546, max degree 919 → 50.
This commit is contained in:
parent
6c7bfb9ec4
commit
94dbca6018
5 changed files with 297 additions and 2 deletions
|
|
@ -421,6 +421,11 @@ fn label_propagation(
|
|||
adj: &HashMap<String, Vec<Edge>>,
|
||||
max_iterations: u32,
|
||||
) -> HashMap<String, u32> {
|
||||
// Only consider edges above this strength for community votes.
|
||||
// Weak auto-links from triangle closure (0.15-0.35) bridge
|
||||
// unrelated clusters — filtering them lets natural communities emerge.
|
||||
let min_strength: f32 = 0.3;
|
||||
|
||||
// Initialize: each node gets its own label
|
||||
let key_vec: Vec<String> = keys.iter().cloned().collect();
|
||||
let mut labels: HashMap<String, u32> = key_vec.iter()
|
||||
|
|
@ -438,9 +443,10 @@ fn label_propagation(
|
|||
};
|
||||
if edges.is_empty() { continue; }
|
||||
|
||||
// Count weighted votes for each label
|
||||
// Count weighted votes for each label (skip weak edges)
|
||||
let mut votes: HashMap<u32, f32> = HashMap::new();
|
||||
for edge in edges {
|
||||
if edge.strength < min_strength { continue; }
|
||||
if let Some(&label) = labels.get(&edge.target) {
|
||||
*votes.entry(label).or_default() += edge.strength;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue