#!/usr/bin/env python
###############################################################################
# Version: 1.1
# Last modified on: 3 April, 2016 
# Developers: Michael G. Epitropakis
#      email: m_(DOT)_epitropakis_(AT)_lancaster_(DOT)_ac_(DOT)_uk 
###############################################################################
from pycec2013.cec2013 import *
import numpy as np
import sys, getopt
from gtk.keysyms import function

def main():
     
	print 70*"="
	# Demonstration of all functions
	for i in range(1,21):
		# Create function
		f = CEC2013(i)

		# Create position vectors
		x = np.ones( f.get_dimension() )

		# Evaluate :-)
		value = f.evaluate(x)
		print "f", i, "(", x, ") = ", f.evaluate(x)

	print 70*"="
	# Demonstration of using how_many_goptima function
	for i in range(1,21):
		# Create function
		f = CEC2013(i)
		dim = f.get_dimension()

		# Create population of position vectors
		pop_size = 10
		X = np.zeros( (pop_size, dim) )
		ub =np.zeros( dim )
		lb =np.zeros( dim )
		# Get lower, upper bounds
		for k in range(dim):
			ub[k] = f.get_ubound(k)
			lb[k] = f.get_lbound(k)

		# Create population within bounds
		fitness = np.zeros( pop_size )
		for j in range(pop_size):
			X[j] = lb + (ub - lb) * np.random.rand( 1 , dim )
			fitness[j] = f.evaluate(X[j])

		# Calculate how many global optima are in the population
		accuracy = 0.001
		count, seeds = how_many_goptima(X, f, accuracy)
		print "In the current population there exist", count, "global optimizers."
		#print "Global optimizers:", seeds
		
		#print X

	print 70*"="
	
def bounds():
	function = int(sys.argv[1])
	f = CEC2013(function)
	dim = f.get_dimension()
    

	# Create population of position vectors
	ub =np.zeros( dim )
	lb =np.zeros( dim )
	# Get lower, upper bounds
	for k in range(dim):
		ub[k] = f.get_ubound(k)
		lb[k] = f.get_lbound(k)	
	print lb,ub
 #python -c 'from demo import bounds; print bounds()'

if __name__ == "__main__":
	main()
