// File: ALSchwalm[P]cppEvolve/include/cppEvolve/TreeGA.hpp
// Function: evolve::TreeGA<int, 100ul>::run(unsigned int, unsigned int)
virtual void run(unsigned int generations,
                     unsigned int logFrequency = 100) {
        for (auto i = 0U; i < PopSize; ++i) {
            population.push_back(generator.make());
        }

        for (auto generation = 0U; generation < generations; ++generation) {
            selector(population, evaluator);

            auto popSizePostSelection = population.size();

            while (population.size() < PopSize) {
                population.push_back(
                    crossover(population[random_uint(popSizePostSelection)],
                              population[random_uint(popSizePostSelection)]));
            }

            for (size_t i = 0; i < PopSize * mutationRate; ++i) {
                auto index = random_uint(PopSize);
                mutator(population[index], generator);
            }

            auto score = evaluator(population[0]);
            if (score > bestScore) {
                delete bestIndividual;
                bestIndividual = population[0]->clone();
                bestScore = score;
            }

            if (generation % logFrequency == 0) {
                std::cout << "Generation(" << generation
                          << ") - Fitness:" << bestScore << std::endl;
            }
        }
        std::cout << "Best: " << *bestIndividual << std::endl;
        std::cout << "Fitness: " << bestScore << std::endl;
    }

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0xf0, %rsp
movq %rdi, -0x8(%rbp)
movl %esi, -0xc(%rbp)
movl %edx, -0x10(%rbp)
movq -0x8(%rbp), %rax
movq %rax, -0x88(%rbp)
movl $0x0, -0x14(%rbp)
movl -0x14(%rbp), %eax
cmpq $0x64, %rax
jae 0x3c4d
movq -0x88(%rbp), %rdi
movq %rdi, %rax
addq $0x8, %rax
movq %rax, -0x90(%rbp)
addq $0x20, %rdi
callq 0xf6a0
movq -0x90(%rbp), %rdi
movq %rax, -0x20(%rbp)
leaq -0x20(%rbp), %rsi
callq 0xf670
movl -0x14(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x14(%rbp)
jmp 0x3c07
movl $0x0, -0x24(%rbp)
movl -0x24(%rbp), %eax
cmpl -0xc(%rbp), %eax
jae 0x3fb9
movq -0x88(%rbp), %rsi
movq %rsi, %rax
addq $0xf8, %rax
movq %rax, -0xa8(%rbp)
movq %rsi, %rax
addq $0x8, %rax
movq %rax, -0xa0(%rbp)
addq $0x98, %rsi
leaq -0x48(%rbp), %rdi
movq %rdi, -0x98(%rbp)
callq 0xf7c0
movq -0xa8(%rbp), %rdi
movq -0xa0(%rbp), %rsi
movq -0x98(%rbp), %rdx
callq 0xf770
jmp 0x3cb8
leaq -0x48(%rbp), %rdi
callq 0xeef0
movq -0x88(%rbp), %rdi
addq $0x8, %rdi
callq 0xb850
movq %rax, -0x60(%rbp)
movq -0x88(%rbp), %rdi
addq $0x8, %rdi
callq 0xb850
cmpq $0x64, %rax
jae 0x3db8
movq -0x88(%rbp), %rax
movq %rax, %rcx
addq $0x8, %rcx
movq %rcx, -0xb0(%rbp)
movq %rax, %rcx
addq $0xb8, %rcx
movq %rcx, -0xc0(%rbp)
addq $0x8, %rax
movq %rax, -0xd0(%rbp)
movq -0x60(%rbp), %rdi
callq 0x2420
movq -0xd0(%rbp), %rdi
movq %rax, %rsi
callq 0xf8b0
movq %rax, %rcx
movq -0x88(%rbp), %rax
movq (%rcx), %rcx
movq %rcx, -0xb8(%rbp)
addq $0x8, %rax
movq %rax, -0xc8(%rbp)
movq -0x60(%rbp), %rdi
callq 0x2420
movq -0xc8(%rbp), %rdi
movq %rax, %rsi
callq 0xf8b0
movq -0xc0(%rbp), %rdi
movq -0xb8(%rbp), %rsi
movq (%rax), %rdx
callq 0xf860
movq -0xb0(%rbp), %rdi
movq %rax, -0x68(%rbp)
leaq -0x68(%rbp), %rsi
callq 0xf670
jmp 0x3cd5
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x50(%rbp)
movl %eax, -0x54(%rbp)
leaq -0x48(%rbp), %rdi
callq 0xeef0
jmp 0x4033
movq $0x0, -0x70(%rbp)
movq -0x70(%rbp), %rax
movq %rax, %rdx
shrq %rdx
movl %eax, %ecx
andl $0x1, %ecx
orq %rdx, %rcx
cvtsi2ss %rcx, %xmm0
addss %xmm0, %xmm0
cvtsi2ss %rax, %xmm1
movss %xmm1, -0xd8(%rbp)
testq %rax, %rax
movss %xmm0, -0xd4(%rbp)
js 0x3e05
movss -0xd8(%rbp), %xmm0
movss %xmm0, -0xd4(%rbp)
movq -0x88(%rbp), %rax
movss -0xd4(%rbp), %xmm1
movss 0xd1fc(%rip), %xmm0     # 0x11018
mulss 0x118(%rax), %xmm0
ucomiss %xmm1, %xmm0
jbe 0x3e86
movl $0x64, %edi
callq 0x2420
movq -0x88(%rbp), %rdi
movq %rax, -0x78(%rbp)
movq %rdi, %rax
addq $0xd8, %rax
movq %rax, -0xe0(%rbp)
addq $0x8, %rdi
movq -0x78(%rbp), %rsi
callq 0xf8b0
movq -0x88(%rbp), %rdx
movq -0xe0(%rbp), %rdi
movq (%rax), %rsi
addq $0x20, %rdx
callq 0xf8d0
movq -0x70(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x70(%rbp)
jmp 0x3dc0
movq -0x88(%rbp), %rdi
movq %rdi, %rax
addq $0x98, %rax
movq %rax, -0xe8(%rbp)
addq $0x8, %rdi
xorl %eax, %eax
movl %eax, %esi
callq 0xf8b0
movq -0xe8(%rbp), %rdi
movq (%rax), %rsi
callq 0xf920
movq -0x88(%rbp), %rax
movss %xmm0, -0x7c(%rbp)
movss -0x7c(%rbp), %xmm0
cvtss2sd %xmm0, %xmm0
ucomisd 0x90(%rax), %xmm0
jbe 0x3f49
movq -0x88(%rbp), %rax
movq 0x88(%rax), %rax
movq %rax, -0xf0(%rbp)
cmpq $0x0, %rax
je 0x3f0b
movq -0xf0(%rbp), %rdi
callq 0xbb00
movq -0xf0(%rbp), %rdi
callq 0x2140
movq -0x88(%rbp), %rdi
addq $0x8, %rdi
xorl %eax, %eax
movl %eax, %esi
callq 0xf8b0
movq (%rax), %rdi
callq 0xabd0
movq %rax, %rcx
movq -0x88(%rbp), %rax
movq %rcx, 0x88(%rax)
movss -0x7c(%rbp), %xmm0
cvtss2sd %xmm0, %xmm0
movsd %xmm0, 0x90(%rax)
movl -0x24(%rbp), %eax
xorl %edx, %edx
divl -0x10(%rbp)
cmpl $0x0, %edx
jne 0x3fa9
movq 0x1707b(%rip), %rdi     # 0x1afd8
leaq 0xd485(%rip), %rsi      # 0x113e9
callq 0x2150
movq %rax, %rdi
movl -0x24(%rbp), %esi
callq 0x21b0
movq %rax, %rdi
leaq 0xd477(%rip), %rsi      # 0x113f5
callq 0x2150
movq %rax, %rdi
movq -0x88(%rbp), %rax
movsd 0x90(%rax), %xmm0
callq 0x2240
movq %rax, %rdi
movq 0x17024(%rip), %rsi     # 0x1afc8
callq 0x2180
jmp 0x3fab
movl -0x24(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x24(%rbp)
jmp 0x3c54
movq 0x17018(%rip), %rdi     # 0x1afd8
leaq 0xd43b(%rip), %rsi      # 0x11402
callq 0x2150
movq %rax, %rdi
movq -0x88(%rbp), %rax
movq 0x88(%rax), %rsi
callq 0xf960
movq %rax, %rdi
movq 0x16fdc(%rip), %rsi     # 0x1afc8
callq 0x2180
movq 0x16fe0(%rip), %rdi     # 0x1afd8
leaq 0xd40a(%rip), %rsi      # 0x11409
callq 0x2150
movq %rax, %rdi
movq -0x88(%rbp), %rax
movsd 0x90(%rax), %xmm0
callq 0x2240
movq %rax, %rdi
movq 0x16fa3(%rip), %rsi     # 0x1afc8
callq 0x2180
addq $0xf0, %rsp
popq %rbp
retq
movq -0x50(%rbp), %rdi
callq 0x2210
nopl (%rax)