Lag, drag, void, use

Assuming you have the lower level operations to detect when a node is collected, when it is used and when it is created:

node' = {node, time CreationTime, time FirstUse, time LastUse}

when a node' is created, it gets its creation time.

when a node' is used first, its FirstUse time gets set

when a note' is used ever, every single time, its gets its LastUse set.

When a node' is collected, its stats can be calculated:
lag = firstuse-creation
drag = now-lastuse
void = if null creationtime then now-creation else 0
use = lastuse-firstuse

I guess the user will want to know which type of nodes, created by which function, are in any state at any discrete time point. This can be done with a set of accumulators, so effectively the graph is built in memory, then when a node' is collected it can be added to this list.

int graph[code][time];
where code is a list of all possible (function,type of node) pairs, and time is a list of discrete time steps.

This will require one pass running, does it miss anything? It doesn't say who holds onto the node, but it does the rest?