mirror of
https://github.com/zenorogue/hyperrogue.git
synced 2024-11-30 15:39:54 +00:00
reg3:: subrule:: remove non-branching NLES
This commit is contained in:
parent
0e14d06e40
commit
58c78220df
42
reg3.cpp
42
reg3.cpp
@ -1904,6 +1904,8 @@ EX namespace reg3 {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* find all back paths */
|
||||||
|
|
||||||
auto &nles = nonlooping_earlier_states;
|
auto &nles = nonlooping_earlier_states;
|
||||||
nles.clear();
|
nles.clear();
|
||||||
vector<address> bfs;
|
vector<address> bfs;
|
||||||
@ -1933,6 +1935,8 @@ EX namespace reg3 {
|
|||||||
for(auto p: q) q2[p]++;
|
for(auto p: q) q2[p]++;
|
||||||
DEBB(DF_GEOM, ("q2 = ", q2));
|
DEBB(DF_GEOM, ("q2 = ", q2));
|
||||||
|
|
||||||
|
/* remove BFS roots, and addresses that lead only there */
|
||||||
|
|
||||||
bfs = {};
|
bfs = {};
|
||||||
for(int i=0; i<isize(root); i++)
|
for(int i=0; i<isize(root); i++)
|
||||||
bfs.emplace_back(i, root[i]);
|
bfs.emplace_back(i, root[i]);
|
||||||
@ -1957,7 +1961,43 @@ EX namespace reg3 {
|
|||||||
}
|
}
|
||||||
|
|
||||||
DEBB(DF_GEOM, ("removed cases = ", isize(bfs)));
|
DEBB(DF_GEOM, ("removed cases = ", isize(bfs)));
|
||||||
|
|
||||||
|
/* remove non-branching states */
|
||||||
|
|
||||||
|
set<address> good;
|
||||||
|
bfs = {};
|
||||||
|
auto visit = [&] (address a) { if(good.count(a)) return; good.insert(a); bfs.push_back(a); };
|
||||||
|
for(auto& a: nonlooping_earlier_states) if(isize(a.second) > 1) visit(a.first);
|
||||||
|
for(int i=0; i<isize(bfs); i++) {
|
||||||
|
address last = bfs[i];
|
||||||
|
int state = last.second;
|
||||||
|
int fv = last.first;
|
||||||
|
for(int d=0; d<childpos[state+1]-childpos[state]; d++) {
|
||||||
|
int nstate = children[childpos[state]+d];
|
||||||
|
if(nstate < -1) nstate += (1<<16);
|
||||||
|
if(nstate >= 0) {
|
||||||
|
address next = {connection(fv, d), nstate};
|
||||||
|
if(!nles.count(next)) continue;
|
||||||
|
visit(next);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
set<address> bad;
|
||||||
|
for(auto& a: nonlooping_earlier_states) if(!good.count(a.first)) bad.insert(a.first);
|
||||||
|
|
||||||
|
for(auto& b: bad) nonlooping_earlier_states.erase(b);
|
||||||
|
|
||||||
|
int to_cut = 0;
|
||||||
|
|
||||||
|
for(auto& a: nonlooping_earlier_states) {
|
||||||
|
set<address> goods;
|
||||||
|
for(auto& b: a.second) if(good.count(b)) goods.insert(b); else to_cut++;
|
||||||
|
a.second = goods;
|
||||||
|
}
|
||||||
|
|
||||||
|
println(hlog, "to_cut = ", to_cut, " from ", isize(bad), " bad cases");
|
||||||
|
|
||||||
// just the number of FV's
|
// just the number of FV's
|
||||||
int pstable = 0;
|
int pstable = 0;
|
||||||
for(auto& p: nonlooping_earlier_states)
|
for(auto& p: nonlooping_earlier_states)
|
||||||
|
Loading…
Reference in New Issue
Block a user