public boolean execute()
{
	long time = peersim.core.CommonState.getTime();
	if ((time % epoch) == 0) {
		initvar = -1.0;
	}
	
	/* Initialization */
	final int len = Network.size();
	IncrementalStats stats = new IncrementalStats();

	/* Compute max, min, average */
	for (int i=0; i < len; i++) {
		Node node = Network.get(i);
		if (node.isUp()) {
			SingleValue protocol = (SingleValue) node.getProtocol(pid);
			try {
				stats.add(protocol.getValue());
			} catch (Exception e) {
				/* 
				 * We do nothing; the node should not be counted in the
				 */ 
			}
		}
	}
	double var = stats.getVar();
	if (initvar < 0 || Double.isNaN(initvar))
	{
		initvar = var;
	}
	double rate = Math.pow(var / initvar, ((double) 1) / (time%epoch) );
    
	/* Printing statistics */
	if (!partial || ((time % epoch)==epoch-1)) {
	System.out.println(name +  
		" TIME " + time +
		" VAR "  + var +
		" RED "  + (var/initvar) +
		" RATE " + rate +
		" AVG "  + 1/stats.getAverage() + 
		" MAX "  + (int) 1/stats.getMin() +
		" MIN "  + (int) 1/stats.getMax() +
		" CNT "  + stats.getN() +
		" SIZE " + len +
		" MAXN " + stats.getMaxCount() +
		" MINN " + stats.getMinCount()
	 );
	}
  
	/* Terminate if accuracy target is reached */
	if (var/initvar <= accuracy) {
		return true;
	} else {
		return false;
	}
}