#include "transfer_sequences.hpp" #include "mealy.hpp" #include #include #include #include using namespace std; transfer_sequences create_transfer_sequences(const mealy& machine, state s){ vector visited(machine.graph_size, false); vector words(machine.graph_size); priority_queue> work; work.push({0, s}); while(!work.empty()){ const auto p = work.top(); const auto u = p.second; const auto d = p.first - 1; work.pop(); if(visited[u.base()]) continue; visited[u.base()] = true; for(input i = 0; i < machine.input_size; ++i){ const auto v = apply(machine, u, i).to; if(visited[v.base()]) continue; words[v.base()] = words[u.base()]; words[v.base()].push_back(i); work.push({d, v}); } } return words; } transfer_sequences create_randomized_transfer_sequences(const mealy & machine, state s){ random_device rd; mt19937 generator(rd()); vector visited(machine.graph_size, false); vector words(machine.graph_size); vector all_inputs(machine.input_size); iota(begin(all_inputs), end(all_inputs), input(0)); priority_queue> work; work.push({0, s}); while(!work.empty()){ const auto p = work.top(); const auto u = p.second; const auto d = p.first - 1; work.pop(); if(visited[u.base()]) continue; visited[u.base()] = true; shuffle(begin(all_inputs), end(all_inputs), generator); for(input i : all_inputs){ const auto v = apply(machine, u, i).to; if(visited[v.base()]) continue; words[v.base()] = words[u.base()]; words[v.base()].push_back(i); work.push({d, v}); } } return words; }