def C(T, num_microstates, microstate_sweep_separation, halt_percent_change, sweep_upper_limit, m_n, m_path, initial_seed, initial_world_grid):
	if info: print 'Beginning C for T = %.3f, n = %d' % (T, m_n)

	E_values = []

	# initialize and run to the first convergence	
	if info2: print '\nStarting microstate # 0'

	# loop_till_conv(T, halt_percent_change, sweep_upper_limit, m_n, initial_seed, initial_world_grid)
	equalized_world_grid, sweep_number = loop_till_conv(T, halt_percent_change, sweep_upper_limit, m_n, initial_seed, initial_world_grid)
	world_grid = np.copy(equalized_world_grid)

	# E_values.append( E(m_n, world_grid) )
	E_values.append( sweepMod.find_E(J, NN_type, equalized_world_grid) )

	if debugging_plots:
		# save debugging plots
		name = 'C_T%.2f_n%d_equalized_world_grid' % (T, m_n)
		plot_grid('Equalized', m_path, name, T, None, None, -9, equalized_world_grid)

	# Run more sweeps to generate more E values
	for i in range(num_microstates-1):
		if info2: print '\nStarting microstate # %d' % (i+1)

		for j in range(microstate_sweep_separation):
			# world_grid = sweep(T, m_n, NN_type, world_grid)	
			sweepMod.run_sweep(T, kB, J, NN_type, initial_seed+1+i, world_grid)

		# E_values.append( E(m_n, world_grid) )
		E_values.append( sweepMod.find_E(J, NN_type, world_grid) )

	if debugging_plots:
		# save debugging plots
		name = 'C_T%.2f_n%d_last_sweep_world_grid' % (T, m_n)
		plot_grid('Last Sweep', m_path, name, T, None, None, -9, world_grid)


	# Compute the variance, then C
	variance_E = np.mean( np.square(E_values) ) - np.mean(E_values)**2

	C = variance_E / (kB*T*T)

	if info: print 'C for T = %.3f, n = %d Completed! C = %.4f' % (T, m_n, C)

	return [C, equalized_world_grid]
def loop_till_conv(T, halt_percent_change, sweep_upper_limit, m_n, initial_seed, world_grid):

	num_history = 10
	history = np.linspace(99.0*m_n*m_n, 99.0*m_n*m_n, num_history)

	old_conv_var = 99.0*m_n*m_n
	new_conv_var = 99.0*m_n*m_n

	sweep_number = 0

	# sweep until the mean of the last num_history percent changes in the convergence variable is < halt_percent_change
	while np.mean(history) > halt_percent_change and sweep_number < sweep_upper_limit:

		# world_grid = sweep(T, m_n, NN_type, world_grid)
		sweepMod.run_sweep(T, kB, J, NN_type, initial_seed+sweep_number, world_grid)

		# new_conv_var = E(m_n, world_grid) # Use E as the convergence variable
		new_conv_var = sweepMod.find_E(J, NN_type, world_grid)

		if new_conv_var != 0.0:
			history[sweep_number%num_history] = abs((new_conv_var - old_conv_var)/new_conv_var) # store the percent change
		else:
			# if debugging2: print 'avoiding divide by zero error'
			history[sweep_number%num_history] = 10*halt_percent_change # give it a large non zero number just to kick it back up and keep it moving


#		if info: print 'Sweep #%d, E = %.2f, DeltaE = %.2f, M = %.2f, conv mean = %.5f' % (sweep_number, new_conv_var, new_conv_var - old_conv_var, M_over_N(m_n, world_grid), np.mean(history) ) # sweep info
		# if info and sweep_number > max(0, sweep_upper_limit-50): print 'Sweep #%d, E = %.2f, DeltaE = %.2f, M = %.2f, conv mean = %.5f' % (sweep_number, new_conv_var, new_conv_var - old_conv_var, M_over_N(m_n, world_grid), np.mean(history) ) # sweep info

		old_conv_var = new_conv_var

		sweep_number += 1

	if sweep_number >= sweep_upper_limit: print 'Warning sweep upper limit hit!\nOn T = %.2f' % T

	return [world_grid, sweep_number]
	n = 500

	initial_world_grid = initialize(n, seed)
	world_grid = np.copy(initial_world_grid)

	for i in range(15):
		print 'On Sweep #%d' % i
		seed += 1
		sweepMod.run_sweep(T, kB, J, NN_type, seed, world_grid)

	t1 = time.time()
	print 'Python E = %.5f' % ( E(n, world_grid) )
	print('Run Time: %s seconds' % (time.time() - t1)) 

	t2 = time.time()
	print 'Compiled C E = %.5f' % ( sweepMod.find_E(J, NN_type, world_grid) )  
	print('Run Time: %s seconds' % (time.time() - t2)) 

	# plot_grid('Initial', output_path, 'initial', T, None, None, -9, initial_world_grid)
	# plot_grid('Final', output_path, 'final', T, None, None, seed, world_grid)


########################################################
########################################################
# Production Runs for paper 

if(True):
	top_output_path = '../output/plots_for_paper_'+nh
	debugging = True
	debugging_plots = False # Good to see, but slows the process down ridiculously 
	debugging2 = True