####################################
# Author: Di Jin
# Date: Feb. 2016
# Goal: k-core algo for 15-826
####################################

def gm_kcore ():

	cur = db_conn.cursor() 

	# Create the tables
	gm_sql_table_drop_create(db_conn, GM_NODES, "node_id integer, inout_degree integer")
	gm_sql_table_drop_create(db_conn, GM_EDGES, "src_id integer, dst_id integer")
	gm_sql_table_drop_create(db_conn, GM_CORE_VALUES, "node_id integer, kvalue") 

	# Create the tables & indices
	cur.execute ("INSERT INTO GM_NODES select src_id, count(*), 1 from GM_EDGES group by src_id")
	cur.execute ("INSERT INTO GM_EDGES select src_id, dst_id from %s" %GM_TABLE )
	cur.execute ("CREATE index node_index on GM_NODES (node_id)")
	cur.execute ("CREATE index degree_index on GM_NODES (inout_degree)")
	cur.execute ("CREATE index src_node_index on GM_EDGES (src_id)")
	cur.execute ("select count(*) from GM_NODES")

	num_nodes = cur.fetchone()[0]

	# shaving
	k = 0
	for i in xrange(0, num_nodes):
		cur.execute ("select node_id, inout_degree from GM_NODES where inout_degree = (select min(inout_degree) from GM_NODES) limit 1")

		node, degree = cur.fetchone()
		k = max(k, degree)

		cur.execute ("update GM_NODES set inout_degree = inout_degree-1 where node_id in (select dst_id from GM_EDGES where src_id = %d )" % node)
		cur.execute ("INSERT INTO GM_CORE_VALUES values (%d, %d)" %(node, k))
		cur.execute ("delete from GM_NODES where node_id = %d" %(node))


	print "The degeneracy value of the graph is: " + str(k)

	cur.execute ("select * from GM_CORE_VALUES")
	res = cur.fetchone()
	for ele in res:
		print ele

	db_conn.commit()
	cur.close()
