def setUp(self):

        self.ges = GrammaticalEvolution()
        self.ges.set_genotype_length(10)
        self.ges.set_population_size(5)
        self.ges.set_max_program_length(200)

        self.ges.set_bnf(''.join([
            '<S>        ::=', 'a = <VALUE1>\n', 'b = <VALUE2>\n',
            'fitness = a + b\n',
            'self.set_bnf_variable("<fitness>", fitness)\n',
            '<VALUE1>     ::= -1 | 2 | 0 \n', '<VALUE2>     ::=  1 | 2 | 3 \n'
        ]))

        self.ges.create_genotypes()

        self.ges.set_fitness_type(MAX)
        #   build a fake history
        value = .5
        for generation in range(3):
            #   Pretend that the genotypes have run
            count = 0
            for gene in self.ges.population:
                gene._fitness = float(count) + value
                self.ges.fitness_list[count][0] = float(count) + value
                self.ges.fitness_list[count][0] = float(count) + value
                count += 1

            self.ges._history.append(deepcopy(self.ges.fitness_list))
    def test_class_init__(self):
        """
        This function tests the initialization of the class.

        """

        ges = GrammaticalEvolution()
        self.assertEqual(None, ges.stopping_criteria[STOPPING_MAX_GEN])
        self.assertEqual(None,
                         ges.stopping_criteria[STOPPING_FITNESS_LANDSCAPE])
        self.assertEqual(DEFAULT_CROSSOVER_RATE, ges._crossover_rate)

        self.assertEqual(DEFAULT_CHILDEREN_PER_CROSSOVER,
                         ges._children_per_crossover)
        self.assertEqual(DEFAULT_MUTATION_TYPE, ges._mutation_type)
        self.assertEqual(DEFAULT_MUTATION_RATE, ges._mutation_rate)
        self.assertEqual(DEFAULT_MAX_FITNESS_RATE, ges._max_fitness_rate)

        #   Parameters for phenotype creation
        self.assertEqual(DEFAULT_WRAP, ges._wrap)
        self.assertEqual(DEFAULT_EXTEND_GENOTYPE, ges._extend_genotype)
        self.assertEqual(DEFAULT_START_GENE_LENGTH, ges._start_gene_length)
        self.assertEqual(DEFAULT_MAX_PROGRAM_LENGTH, ges._max_gene_length)
        self.assertEqual(DEFAULT_MAX_PROGRAM_LENGTH, ges._max_program_length)

        #   Parameters for overall process
        self.assertEqual(0, ges._generation)
        self.assertEqual(FitnessList(CENTER), ges.fitness_list)
        self.assertEqual(DEFAULT_FITNESS_FAIL, ges._fitness_fail)
        self.assertEqual(DEFAULT_MAINTAIN_HISTORY, ges._maintain_history)
        self.assertEqual(DEFAULT_TIMEOUTS, ges._timeouts)

        #   Parameters used during runtime
        self.assertEqual(None, ges.current_g)
        self.assertEqual([], ges._fitness_selections)
        self.assertEqual([], ges._replacement_selections)

        self.assertEqual({}, ges.bnf)
        self.assertEqual(0, ges._population_size)
        self.assertEqual([], ges.population)

        self.assertEqual([], ges._history)
<plus>              ::= +
<minus>             ::= -
<real>              ::= <int-const>.<int-const>
<int-const>         ::= <int-const> | 1 | 2 | 3 | 4 | 5 | 6 |
                        7 | 8 | 9 | 0
<S>                 ::=
import math
total = 0.0
for i in xrange(100):
    value = float(i) / float(100)
    total += abs(<expr> - pow(value, 3))
fitness = total
self.set_bnf_variable('<fitness>', fitness)
        """

ges = GrammaticalEvolution()

ges.set_bnf(bnf)
ges.set_genotype_length(start_gene_length=20, max_gene_length=50)
ges.set_population_size(50)
ges.set_wrap(True)

ges.set_max_generations(1000)
ges.set_fitness_type(MIN, .01)

ges.set_max_program_length(500)
ges.set_timeouts(10, 120)
ges.set_fitness_fail(100.0)

ges.set_mutation_rate(.025)
ges.set_fitness_selections(