public void run()
	{
		List<CyNode> allNodes = new ArrayList<CyNode>();
		allNodes = network.getNodeList();
		CyRow row;

		if(doRestart)
		{
			for(CyNode currNode : allNodes)
			{
				row = ColumnsCreator.DefaultNodeTable.getRow(currNode.getSUID());
				Double initialOutput = row.get(ColumnsCreator.INITIAL_OUTPUT_VALUE, Double.class);
				row.set(ColumnsCreator.CURR_OUTPUT, initialOutput);
			}
		}
		
		while(running)
		{
			for(CyNode currNode : allNodes)
			{
				Double nextOutput = evaluate(currNode, network);
				row = ColumnsCreator.HiddenNodeTable.getRow(currNode.getSUID());
				row.set(ColumnsCreator.NEXT_OUTPUT, nextOutput);
			}
			
			for(CyNode currNode : allNodes)
			{
				row = ColumnsCreator.HiddenNodeTable.getRow(currNode.getSUID());
				Double currOutput = row.get(ColumnsCreator.NEXT_OUTPUT, Double.class);
				row = ColumnsCreator.DefaultNodeTable.getRow(currNode.getSUID());
				row.set(ColumnsCreator.CURR_OUTPUT, currOutput);
				 
				//Set the EDGE_SOURCE_NODE_OUTPUT for all outgoing edges
				List<CyEdge> outgoingEdges = new ArrayList<CyEdge>();
				outgoingEdges = network.getAdjacentEdgeList(currNode, CyEdge.Type.OUTGOING);
				for(CyEdge currEdge : outgoingEdges)
				{
					row = ColumnsCreator.DefaultEdgeTable.getRow(currEdge.getSUID());
					row.set(ColumnsCreator.EDGE_SOURCE_NODE_OUTPUT, currOutput);
				}
			}
			
			viewHandler.refresh(networkView);
			
			try {
				Thread.sleep((long)(10000 - appContext.getSpeed()*1000));
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}