spreadActivation method
Spreads activation from sourceId through its edges.
Activation decays with distance: each hop multiplies by decay.
Returns a map of conceptId → spread activation.
Implementation
Map<String, double> spreadActivation(
String sourceId, {
int maxHops = 3,
double decay = 0.5,
}) {
final result = <String, double>{};
final source = _nodes[sourceId];
if (source == null) return result;
final initialActivation = source.concept.activationLevel;
final queue = Queue<_SpreadEntry>();
queue.add(_SpreadEntry(
nodeId: sourceId,
activation: initialActivation,
hops: 0,
));
final visited = <String>{};
while (queue.isNotEmpty) {
final entry = queue.removeFirst();
if (visited.contains(entry.nodeId)) continue;
if (entry.hops >= maxHops) continue;
visited.add(entry.nodeId);
result[entry.nodeId] = (result[entry.nodeId] ?? 0.0) + entry.activation;
final node = _nodes[entry.nodeId];
if (node != null) {
for (final edge in node.edges.values) {
final spreadAmt = entry.activation * edge.strength * decay;
if (spreadAmt > 0.01) {
queue.addLast(_SpreadEntry(
nodeId: edge.targetId,
activation: spreadAmt,
hops: entry.hops + 1,
));
}
}
}
}
result.remove(sourceId); // Don't return the source itself
return result;
}