#ifndef KEYBOARD_H_INCLUDED #define KEYBOARD_H_INCLUDED #include #include #include #include #include "pcg_random.hpp" using chromosome = std::pair>; using phenotype = std::array; phenotype keymap(std::string d); std::string keymap(phenotype d); phenotype keysFromGenome(chromosome); chromosome genomeFromKeys(phenotype); extern std::array, 126> space_maps; extern std::array spaceTable; class sKeymap { public: sKeymap(const phenotype& k) : keys(k), genome(genomeFromKeys(k)) {;} sKeymap(const chromosome& g, [[maybe_unused]] int=0) : keys(keysFromGenome(g)), genome(g) {;} sKeymap(pcg32_k64&); sKeymap() : genome(0, build>([](){return 0;})) { fixKeys(); } //Swaps divergence keys with random keys sKeymap mutate_fast(int divergence, pcg32_k64&) const; //Swaps divergence keys with their neighbors //Slow means: slower genetic change, and probably slower execution sKeymap mutate_slow(int divergence, pcg32_k64&) const; sKeymap mutate(int divergence, pcg32_k64&) const; //Genewise-uniform crossover, spaces are half-uniform bitwise friend sKeymap breed(sKeymap, const sKeymap&, pcg32_k64&); const phenotype& exportKeys() const {return keys;} // private: void fixKeys() {keys = keysFromGenome(genome);} void fixGenome() {genome = genomeFromKeys(keys);} phenotype keys; chromosome genome; constexpr const static int rowlen{10}, collen{3}; }; sKeymap breed(sKeymap, const sKeymap&, pcg32_k64&); constexpr const int isize = 30; #endif //KEYBOARD_H_INCLUDED