// callback for keyboard events void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods) { if (key == GLFW_KEY_R && action == GLFW_PRESS){ // reset all the instances std::list<ModelInstance>::iterator it; for(it = gInstances.begin(); it != gInstances.end(); ++it){ (*it).transform = random_transform(); } } }
transform_model* evolve_transform( const language_model* model, const char* text, int (*controller) ( int iteration, transform_model* transform, const char* better_output, unsigned long score)){ const int population_count = POPULATION_SIZE; transform_model* population[population_count]; // Initial population { int i; for (i = 0; i < population_count; i++){ population[i] = random_transform(); } } long iteration; int done = 0; for (iteration = 0;!done;iteration++){ { int i; for (i = 0; i < population_count; i++){ char* out = process(population[i], text, model); free(out); } } qsort(&population, population_count, sizeof(transform_model*), inv_language_score_cmp); { transform_model* winner = population[0]; char* better = process(winner, text, model); int action = controller(iteration, winner, better, winner->score); if ((iteration % SHOW_INTERVAL) == 0) { int limit = strlen(better); // Make the “better” string readable if (limit > 50){ strcpy(&better[40], "\x1b[7m%\x1b[0m"); limit = 40; } int i; for (i = 0; i < limit; i++){ if ((!isalnum(better[i])) && (!ispunct(better[i])) && (better[i] != ' ')){ better[i] = '.'; } } printf("Iteration (%5li) [%5li | %3li]: |\x1b[1m%s\x1b[0m|\n", iteration, winner->score, winner->output_size, better); } free(better); switch(action){ case EVOLVE_SHAKE: shake(population); case EVOLVE_CONTINUE: cross(population, iteration, text); break; case EVOLVE_DONE: done = 1; break; default: printf("Unknown action code: %i\n", action); } } } // Free population { int i; for (i = 1; i < population_count; i++){ free_transform_model(population[i]); } } return population[0]; }
// convenience function that returns a random generated instance static void CreateRandomInstance() { ModelInstance instance; instance.asset = &gBox; instance.transform = random_transform(); gInstances.push_back(instance); }