spreadActivation method

Map<String, double> spreadActivation(
  1. String sourceId, {
  2. int maxHops = 3,
  3. double decay = 0.5,
})

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;
}