public void calc() throws NeuronNotFound
	{
		cache = new HashMap<BigInteger, Neuron>();
		for (BigInteger k : neuroPool.keySet())
		{
			SObject so = neuroPool.get(k);
			if (!so.getType().equalsIgnoreCase("neuron"))
				continue;
			Neuron n = (Neuron)so;
			if (n.getState() == NeuronConst.STATE_READY)
			{
				n.calc();
				n.emit();
			}
			if (n.getState() == NeuronConst.STATE_INIT)
			{
				cache.put(n.getID(), n);
			}
		}
		while (!cache.isEmpty())
		{
			HashMap<BigInteger, Neuron> bufferCache = new HashMap<BigInteger, Neuron>();
			Iterator<Neuron> it = cache.values().iterator();
			while (it.hasNext())
			{
				Neuron n = it.next();
				if (n.getState() == NeuronConst.STATE_READY)
				{
					n.calc();
					n.emit();
				}
				else
				{
					bufferCache.put(n.getID(), n);
				}
			}
			cache = bufferCache;
		}
	}