feat(calc): add fwd node tree as factor effecting node size

This commit is contained in:
Kritagya Bhattarai (CalfMoon) 2025-03-09 18:49:03 +05:45
parent 38dd7aef56
commit 04d5324e15

View file

@ -21,26 +21,84 @@ export default class NodeFactor extends Plugin {
const nodes: ObsidianNode[] = leaf.view.renderer.nodes;
if (nodes.length === 0) return;
setInterval(() => {
nodes.forEach((node) => {
const weight = this.calcNodeWeight(node);
node.weight = weight;
});
}, 1);
const start = performance.now();
const treeOptimizeMap: Map<string, number> = new Map();
nodes.forEach((node) => {
const weight = this.calcNodeWeight(node, treeOptimizeMap);
node.weight = weight;
});
// setInterval(() => {
// const treeOptimizeMap: Map<string, number> = new Map();
// nodes.forEach((node) => {
// const weight = this.calcNodeWeight(
// node,
// treeOptimizeMap,
// );
// node.weight = weight;
// });
// }, 10);
console.log(performance.now() - start);
}),
);
}
private calcNodeWeight(node: ObsidianNode): number {
private calcNodeWeight(
node: ObsidianNode,
treeOptimizeMap: Map<string, number>,
): number {
const settings = this.settings;
let weight = 0;
weight += Object.keys(node.reverse).length * settings.bwdMultiplier;
weight += Object.keys(node.forward).length * settings.fwdMultiplier;
if (settings.fwdTree) {
weight +=
this.fwdNodeTreeSize(node, node.id, treeOptimizeMap) *
settings.fwdMultiplier;
} else {
weight += Object.keys(node.forward).length * settings.fwdMultiplier;
}
return weight;
}
private fwdNodeTreeSize(
node: ObsidianNode,
id: string,
treeOptimizeMap: Map<string, number>,
): number {
let size = 0;
const sizeMap = treeOptimizeMap.get(node.id);
// the block below
if (sizeMap !== undefined) {
return sizeMap as number;
}
Object.entries(node.forward).forEach(([key, value]) => {
// @ts-ignore
const childNode: ObsidianNode = value.target;
// Prevents looping if A -> B -> C -> A
if (key === id) return size;
size++;
const childSize = this.fwdNodeTreeSize(
childNode,
id,
treeOptimizeMap,
);
size += childSize;
});
treeOptimizeMap.set(node.id, size);
return size;
}
async loadSettings() {
this.settings = Object.assign(
{},