void scheduleUpdate() {
        if (!dynamic) return;
        if (updating) return;
        // trace("consider update", this);
        int load = queueLength + 1;
        for (int l=0; l<maxLevel; l++) {
            // look for changes
            for (int z=0; z<maxOrder; z++) {
                double now = delay[l][z]+load;
                double past = promise[l][z];
                if (past == 0) {
                    updating = true;
                } else {
                    double diff = Math.abs(now-past)/past;
                    updating |= diff > 0.20;
                }
            }
        }
        if (!updating) return;

        // trace("schedule update", this);
        for (int l=0; l<maxLevel; l++) {
            for (int z=0; z<maxOrder; z++) {
                promise[l][z] = delay[l][z]+load;
            }
        }
        queue(EventBlock.newUpdate(clock+0.2, nodeNum));
    }