mirror of
https://github.com/zenorogue/hyperrogue.git
synced 2025-05-21 08:34:06 +00:00
rulegen3:: validate_neighborhood
This commit is contained in:
parent
d6376bcaec
commit
d571d2f1cb
@ -96,7 +96,8 @@ static const flagtype w_r3_no_road_shortcuts = Flag(36); /*< consider all errors
|
|||||||
/** these control the output */
|
/** these control the output */
|
||||||
EX flagtype rdebug_flags;
|
EX flagtype rdebug_flags;
|
||||||
|
|
||||||
EX int r3_neighborhood_decision = 1; /* how far to build local for honeycombs */
|
EX int r3_neighborhood_decision = 1; /* how far to build local for honeycombs, for decision trees */
|
||||||
|
EX int r3_neighborhood_validate = 0; /* how far to build local for honeycombs, for validation */
|
||||||
|
|
||||||
EX flagtype flags = 0;
|
EX flagtype flags = 0;
|
||||||
|
|
||||||
@ -1406,6 +1407,7 @@ EX pair<int, int> get_code(twalker& cw) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
be_solid(c);
|
be_solid(c);
|
||||||
|
if(WDIM == 3) validate_neighborhood(cw.at);
|
||||||
|
|
||||||
twalker cd = c->dist == 0 ? twalker(c, 0) : get_parent_dir(cw);
|
twalker cd = c->dist == 0 ? twalker(c, 0) : get_parent_dir(cw);
|
||||||
if(cd.at != c) ufind(cw);
|
if(cd.at != c) ufind(cw);
|
||||||
@ -2506,6 +2508,7 @@ auto hooks = addHook(hooks_configfile, 100, [] {
|
|||||||
param_i(max_ignore_time_pre, "max_ignore_time_pre");
|
param_i(max_ignore_time_pre, "max_ignore_time_pre");
|
||||||
param_i(max_ignore_time_post, "max_ignore_time_post");
|
param_i(max_ignore_time_post, "max_ignore_time_post");
|
||||||
param_i(r3_neighborhood_decision, "r3_neighborhood_decision");
|
param_i(r3_neighborhood_decision, "r3_neighborhood_decision");
|
||||||
|
param_i(r3_neighborhood_validate, "r3_neighborhood_validate");
|
||||||
});
|
});
|
||||||
|
|
||||||
EX void parse_treestate(arb::arbi_tiling& c, exp_parser& ep) {
|
EX void parse_treestate(arb::arbi_tiling& c, exp_parser& ep) {
|
||||||
|
45
rulegen3.cpp
45
rulegen3.cpp
@ -149,11 +149,13 @@ EX int get_roadsign(twalker what) {
|
|||||||
using neighborhood = vector<pair<int, int>>;
|
using neighborhood = vector<pair<int, int>>;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
map<pair<int, int>, neighborhood> all_edges;
|
map<pair<int, int>, neighborhood> decision_neighborhoods;
|
||||||
|
map<pair<int, int>, neighborhood> validate_neighborhoods;
|
||||||
|
|
||||||
EX void build_neighborhood(twalker cw, neighborhood& ae, flagtype dec) {
|
EX void build_neighborhood(twalker cw, neighborhood& ae, flagtype dec) {
|
||||||
set<tcell*> seen;
|
set<tcell*> seen;
|
||||||
vector<pair<twalker, transmatrix> > visited;
|
vector<pair<twalker, transmatrix> > visited;
|
||||||
|
vector<pair<twalker, transmatrix> > visited1;
|
||||||
vector<pair<int, int>> ae1;
|
vector<pair<int, int>> ae1;
|
||||||
auto visit = [&] (twalker tw, const transmatrix& T, int id, int dir) {
|
auto visit = [&] (twalker tw, const transmatrix& T, int id, int dir) {
|
||||||
if(seen.count(tw.at)) return;
|
if(seen.count(tw.at)) return;
|
||||||
@ -186,16 +188,49 @@ EX void build_neighborhood(twalker cw, neighborhood& ae, flagtype dec) {
|
|||||||
visit(tw + j + wstep, visited[i].second * currentmap->adj(tcell_to_cell[tw.at], (tw+j).spin), i, j);
|
visit(tw + j + wstep, visited[i].second * currentmap->adj(tcell_to_cell[tw.at], (tw+j).spin), i, j);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(dec & 4) for(auto p: ae1) ae.push_back(p);
|
if(dec & 4) {
|
||||||
println(hlog, "for ", tie(cw.at->id, cw.spin), " generated all_edges structure: ", ae, " of size ", isize(ae));
|
for(auto p: ae1) ae.push_back(p);
|
||||||
|
for(auto v: visited1) visited1.push_back(v);
|
||||||
|
}
|
||||||
|
if(dec & 8) {
|
||||||
|
for(int i=0; i<isize(visited); i++) {
|
||||||
|
for(int j=0; j<visited[i].first.at->type; j++) {
|
||||||
|
twalker t = visited[i].first + j + wstep;
|
||||||
|
for(int s=i+1; s<isize(visited); s++) {
|
||||||
|
if(visited[s].first.at == t.at && ae[s].first != i)
|
||||||
|
ae.push_back({i, j});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
EX neighborhood& get_decision_neighborhood(twalker cw) {
|
EX neighborhood& get_decision_neighborhood(twalker cw) {
|
||||||
auto& ae = all_edges[{cw.at->id, cw.spin}];
|
auto& ae = decision_neighborhoods[{cw.at->id, cw.spin}];
|
||||||
if(ae.empty()) build_neighborhood(cw, ae, r3_neighborhood_decision);
|
if(ae.empty()) {
|
||||||
|
build_neighborhood(cw, ae, r3_neighborhood_decision);
|
||||||
|
println(hlog, "built decision neighborhood for ", tie(cw.at->id, cw.spin), " of size ", isize(ae));
|
||||||
|
}
|
||||||
return ae;
|
return ae;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
EX neighborhood& get_validate_neighborhood(twalker cw) {
|
||||||
|
auto& ae = validate_neighborhoods[{cw.at->id, cw.spin}];
|
||||||
|
if(ae.empty()) {
|
||||||
|
build_neighborhood(cw, ae, r3_neighborhood_validate);
|
||||||
|
println(hlog, "built validate neighborhood for ", tie(cw.at->id, cw.spin), " of size ", isize(ae));
|
||||||
|
}
|
||||||
|
return ae;
|
||||||
|
}
|
||||||
|
|
||||||
|
EX void validate_neighborhood(twalker cw) {
|
||||||
|
if(!r3_neighborhood_validate) return;
|
||||||
|
auto& ae = get_validate_neighborhood(cw);
|
||||||
|
vector<twalker> list = { cw };
|
||||||
|
for(auto v: ae) if(v.first != -1)
|
||||||
|
list.push_back(list[v.first] + v.second + wstep);
|
||||||
|
}
|
||||||
|
|
||||||
int last_qroad;
|
int last_qroad;
|
||||||
|
|
||||||
vector<vector<pair<int,int>>> possible_parents;
|
vector<vector<pair<int,int>>> possible_parents;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user