public String analyse(){
		this.outgoing.clear();
		this.incoming.clear();
		
		initializeAllOutgoing();
		
		int initId;
		try
		{
			initId = this.strategy.getIdOfInitialNode(this.graph);
		}catch(Exception e){
			throw new RuntimeException(e);
		}
		
		Set<Node> changed = new HashSet<Node>(graph.getNodes());
		Node initialNode = graph.getNode(initId);
		Set<Expression> initialSetIncoming = this.strategy.getInitializationIncoming(this.graph);
		this.incoming.put(initialNode, initialSetIncoming);
		this.strategy.applyStatement(initialNode, this.incoming.get(initialNode), this.outgoing.get(initialNode));
		changed.remove(initialNode);
		
		while(!changed.isEmpty()){
			Node currentNode = getAnyNode(changed);
			assert(currentNode != null);
			changed.remove(currentNode);
			
			calculateIncoming(currentNode);
			
			Set<Expression> oldOutgoing = new HashSet<Expression>(this.outgoing.get(currentNode));
			this.strategy.applyStatement(currentNode, this.incoming.get(currentNode), this.outgoing.get(currentNode));

			if(!this.outgoing.get(currentNode).equals(oldOutgoing)){
				changed.addAll(this.strategy.getNodesToRecalculate(currentNode, this.graph));
			}
		}
		
		return getExpressionsHTML();
	}