1
Fork 0
mirror of https://github.com/Jaxan/hybrid-ads.git synced 2025-04-27 23:17:44 +02:00
hybrid-ads/lib/transfer_sequences.cpp
2015-03-19 17:25:34 +01:00

74 lines
1.6 KiB
C++

#include "transfer_sequences.hpp"
#include "mealy.hpp"
#include <algorithm>
#include <numeric>
#include <queue>
#include <random>
using namespace std;
transfer_sequences create_transfer_sequences(const mealy& machine, state s){
vector<bool> visited(machine.graph_size, false);
vector<word> words(machine.graph_size);
priority_queue<pair<int, state>> 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<bool> visited(machine.graph_size, false);
vector<word> words(machine.graph_size);
vector<input> all_inputs(machine.input_size);
iota(begin(all_inputs), end(all_inputs), input(0));
priority_queue<pair<int, state>> 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;
}