def main(graphFileName, featuresFileName, featureListFile, trainingFileName, k):

	# Read ego network
	global graph
	graph = igraph.Graph.Read_Ncol(graphFileName)
	graph.vs["membership"] = 0

	# Read feature names	
	with open(featureListFile, "r") as featureList:
		for line in featureList:
			featureNames.append(line.strip())
			graph.vs[line.strip()] = None
				
	
	# Read feature values of nodes
	with open(featuresFileName, "r") as featuresFile: 
		for line in featuresFile:
			features = line.split(" ")	
			for feature in features[1:-1]:
				try:
					node = graph.vs[int(features[0])]
					node[";".join(feature.split(";")[0:-1])] = feature.split(";")[-1]
				except:
					pass
			
			
	
	# Run K-Means on the graph
	clusters = kmeans(graph, k)
	newClusters = clusters
	
	# Store in each node the cluster it belongs to.
	i = 0
	for membership in clusters.membership:
		graph.vs[i]['membership'] = membership
		i = i + 1
	
	
	# Plot final clusters
	print newClusters
	igraph.plot(newClusters)
	
	# Plot actual clusters from training data
	actualClusters = getTrainingClusters(graphFileName, trainingFileName)
	print actualClusters
	igraph.plot(actualClusters)

	i = 0
	count = 0
	for node1 in graph.vs:
		for node2 in graph.vs:
			if(actualClusters.membership[node1.index] == actualClusters.membership[node2.index] and newClusters.membership[node1.index] == newClusters.membership[node2.index]):
				count = count + 1
			elif(actualClusters.membership[node1.index] != actualClusters.membership[node2.index] and newClusters.membership[node1.index] != newClusters.membership[node2.index]):
				count = count + 1
			i = i + 1
	error = (float(count) / float(i))
	print error
def compare(graphFileName, trainingFileName):
    graph = igraph.Graph.Read_Ncol(graphFileName)
    clustersList = []
    actualClusters = getTrainingClusters(graphFileName, trainingFileName)
    clustersList.append(graph.as_undirected().community_multilevel())
    clustersList.append(graph.community_edge_betweenness())
    # clustersList.append(graph.community_optimal_modularity())
    clustersList.append(graph.community_label_propagation())
    # clustersList.append(graph.as_undirected().community_fastgreedy())
    clustersList.append(graph.community_infomap())
    clustersList.append(graph.as_undirected().community_leading_eigenvector())
    return (actualClusters, clustersList)
def main(graphFileName, featuresFileName, featureListFile, trainingFileName):
	

	# Read ego network
	graph = igraph.Graph.Read_Ncol(graphFileName)

	# Read feature names	
	featureNames = []
	with open(featureListFile, "r") as featureList:
		for line in featureList:
			featureNames.append(line.strip())
			graph.vs[line.strip()] = None
				
	
	# Read feature values of nodes
	with open(featuresFileName, "r") as featuresFile: 
		for line in featuresFile:
			features = line.split(" ")	
			for feature in features[1:-1]:
				try:
					node = graph.vs[int(features[0])]
					node[";".join(feature.split(";")[0:-1])] = feature.split(";")[-1]
				except:
					pass
			
			
	# Clustering
	clusters = graph.community_infomap()
	
	# Store in each node the cluster it belongs to.
	i = 0
	for membership in clusters.membership:
		graph.vs[i]['membership'] = membership
		i = i + 1
	
	# Iteratively refine clusters.
	igraph.plot(clusters)
	parameters = calculateParameters(graph, clusters, featureNames)
	newClusters = refineClusters(graph, parameters)
	while clusterDifference(clusters, newClusters) == True:
		parameters = calculateParameters(graph, newClusters, featureNames)
		clusters = newClusters
		newClusters = refineClusters(graph, parameters)
	
	# Plot final clusters
	print newClusters
	igraph.plot(newClusters)
	
	# Plot actual clusters from training data
	actualClusters = getTrainingClusters(graphFileName, trainingFileName)
	print actualClusters
	igraph.plot(actualClusters)

	i = 0
	count = 0
	for node1 in graph.vs:
		for node2 in graph.vs:
			if(actualClusters.membership[node1.index] == actualClusters.membership[node2.index] and newClusters.membership[node1.index] == newClusters.membership[node2.index]):
				count = count + 1
			elif(actualClusters.membership[node1.index] != actualClusters.membership[node2.index] and newClusters.membership[node1.index] != newClusters.membership[node2.index]):
				count = count + 1
			i = i + 1
	error = (float(count) / float(i))
	print error