remove decay, fix_categories, and categorize
Graph-wide decay is the wrong approach — node importance should emerge from graph topology (degree, centrality, usage patterns), not a global weight field multiplied by a category-specific factor. Remove: Store::decay(), Store::categorize(), Store::fix_categories(), Category::decay_factor(), cmd_decay, cmd_categorize, cmd_fix_categories, job_decay, and all category assignments at node creation time. Category remains in the schema as a vestigial field (removing it requires a capnp migration) but no longer affects behavior. Co-Authored-By: ProofOfConcept <poc@bcachefs.org>
This commit is contained in:
parent
804578b977
commit
4bc74ca4a2
6 changed files with 0 additions and 198 deletions
100
src/store/ops.rs
100
src/store/ops.rs
|
|
@ -172,106 +172,6 @@ impl Store {
|
|||
});
|
||||
}
|
||||
|
||||
pub fn categorize(&mut self, key: &str, cat_str: &str) -> Result<(), String> {
|
||||
let cat = Category::from_str(cat_str)
|
||||
.ok_or_else(|| format!("Unknown category '{}'. Use: core/tech/gen/obs/task", cat_str))?;
|
||||
self.modify_node(key, |n| { n.category = cat; })
|
||||
}
|
||||
|
||||
pub fn decay(&mut self) -> (usize, usize) {
|
||||
let base = self.params.decay_factor;
|
||||
let threshold = self.params.prune_threshold as f32;
|
||||
let mut decayed = 0;
|
||||
let mut pruned = 0;
|
||||
let mut updated = Vec::new();
|
||||
|
||||
for (_key, node) in &mut self.nodes {
|
||||
let factor = node.category.decay_factor(base) as f32;
|
||||
let old_weight = node.weight;
|
||||
node.weight *= factor;
|
||||
|
||||
// Clamp near-prune nodes instead of removing
|
||||
if node.weight < threshold {
|
||||
node.weight = node.weight.max(0.01);
|
||||
pruned += 1;
|
||||
}
|
||||
|
||||
// Only persist nodes whose weight actually changed
|
||||
// Don't bump version — decay is metadata, not content change
|
||||
if (node.weight - old_weight).abs() > 1e-6 {
|
||||
updated.push(node.clone());
|
||||
decayed += 1;
|
||||
}
|
||||
}
|
||||
|
||||
if !updated.is_empty() {
|
||||
let _ = self.append_nodes(&updated);
|
||||
}
|
||||
|
||||
(decayed, pruned)
|
||||
}
|
||||
|
||||
/// Bulk recategorize nodes using rule-based logic.
|
||||
/// Returns (changed, unchanged) counts.
|
||||
pub fn fix_categories(&mut self) -> Result<(usize, usize), String> {
|
||||
let cfg = crate::config::get();
|
||||
let core_files: Vec<&str> = cfg.core_nodes.iter().map(|s| s.as_str()).collect();
|
||||
let tech_files = [
|
||||
"language-theory", "zoom-navigation",
|
||||
"rust-conversion", "poc-architecture",
|
||||
];
|
||||
let tech_prefixes = ["design-"];
|
||||
let obs_files = [
|
||||
"reflections", "reflections-zoom", "differentiation",
|
||||
"cognitive-modes", "paper-notes", "inner-life",
|
||||
"conversation", "interests", "stuck-toolkit",
|
||||
];
|
||||
let obs_prefixes = ["skill-", "worked-example-"];
|
||||
|
||||
let mut changed_nodes = Vec::new();
|
||||
let mut unchanged = 0;
|
||||
|
||||
let keys: Vec<String> = self.nodes.keys().cloned().collect();
|
||||
for key in &keys {
|
||||
let node = self.nodes.get(key).unwrap();
|
||||
if node.category != Category::Core {
|
||||
unchanged += 1;
|
||||
continue;
|
||||
}
|
||||
|
||||
let file = key.split('#').next().unwrap_or(key);
|
||||
|
||||
let new_cat = if core_files.iter().any(|&f| file == f) {
|
||||
None
|
||||
} else if tech_files.iter().any(|&f| file == f)
|
||||
|| tech_prefixes.iter().any(|p| file.starts_with(p))
|
||||
{
|
||||
Some(Category::Technical)
|
||||
} else if obs_files.iter().any(|&f| file == f)
|
||||
|| obs_prefixes.iter().any(|p| file.starts_with(p))
|
||||
{
|
||||
Some(Category::Observation)
|
||||
} else {
|
||||
Some(Category::General)
|
||||
};
|
||||
|
||||
if let Some(cat) = new_cat {
|
||||
let node = self.nodes.get_mut(key).unwrap();
|
||||
node.category = cat;
|
||||
node.version += 1;
|
||||
changed_nodes.push(node.clone());
|
||||
} else {
|
||||
unchanged += 1;
|
||||
}
|
||||
}
|
||||
|
||||
if !changed_nodes.is_empty() {
|
||||
self.append_nodes(&changed_nodes)?;
|
||||
}
|
||||
|
||||
Ok((changed_nodes.len(), unchanged))
|
||||
}
|
||||
|
||||
/// Cap node degree by soft-deleting edges from mega-hubs.
|
||||
pub fn cap_degree(&mut self, max_degree: usize) -> Result<(usize, usize), String> {
|
||||
let mut node_degree: HashMap<String, usize> = HashMap::new();
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue