1
Fork 0
mirror of https://github.com/Jaxan/hybrid-ads.git synced 2025-04-27 23:17:44 +02:00
hybrid-ads/lib/separating_matrix.cpp
Joshua Moerman 7fcafba6e9 Refactor
2015-05-04 10:21:44 +02:00

53 lines
1.2 KiB
C++

#include "separating_matrix.hpp"
#include <cassert>
#include <functional>
#include <queue>
using namespace std;
separating_matrix create_all_pair_seperating_sequences(const splitting_tree & root){
const auto N = root.states.size();
separating_matrix all_pair_seperating_sequences(N, separating_row(N));
queue<reference_wrapper<const splitting_tree>> work;
work.push(root);
// total complexity is O(n^2), as we're visiting each pair only once :)
while(!work.empty()){
const splitting_tree & node = work.front();
work.pop();
auto it = begin(node.children);
auto ed = end(node.children);
while(it != ed){
auto jt = next(it);
while(jt != ed){
for(auto && s : it->states){
for(auto && t : jt->states){
assert(all_pair_seperating_sequences[t][s].empty());
assert(all_pair_seperating_sequences[s][t].empty());
all_pair_seperating_sequences[t][s] = node.seperator;
all_pair_seperating_sequences[s][t] = node.seperator;
}
}
jt++;
}
it++;
}
for(auto && c : node.children){
work.push(c);
}
}
for(size_t i = 0; i < N; ++i){
for(size_t j = 0; j < N; ++j){
if(i == j) continue;
assert(!all_pair_seperating_sequences[i][j].empty());
}
}
return all_pair_seperating_sequences;
}