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);
		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) (stats.getMin() == 0 ? Integer.MAX_VALUE : 1/stats.getMin()) +
      " MIN " + (int) 1/stats.getMax() +
      " CNT " + stats.getN() +
      " SIZE " + len
     );
	}
  
  /* Terminate if accuracy target is reached */
	if (var/initvar <= accuracy) {
		return true;
	} else {
		return false;
	}
}