diff --git a/rulegen.cpp b/rulegen.cpp index faef0515..d3c42d15 100644 --- a/rulegen.cpp +++ b/rulegen.cpp @@ -96,7 +96,8 @@ static const flagtype w_r3_no_road_shortcuts = Flag(36); /*< consider all errors /** these control the output */ 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; @@ -1406,6 +1407,7 @@ EX pair get_code(twalker& cw) { } be_solid(c); + if(WDIM == 3) validate_neighborhood(cw.at); twalker cd = c->dist == 0 ? twalker(c, 0) : get_parent_dir(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_post, "max_ignore_time_post"); 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) { diff --git a/rulegen3.cpp b/rulegen3.cpp index b7cc4b7a..4926f7d2 100644 --- a/rulegen3.cpp +++ b/rulegen3.cpp @@ -149,11 +149,13 @@ EX int get_roadsign(twalker what) { using neighborhood = vector>; #endif -map, neighborhood> all_edges; +map, neighborhood> decision_neighborhoods; +map, neighborhood> validate_neighborhoods; EX void build_neighborhood(twalker cw, neighborhood& ae, flagtype dec) { set seen; vector > visited; + vector > visited1; vector> ae1; auto visit = [&] (twalker tw, const transmatrix& T, int id, int dir) { 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); } } - if(dec & 4) for(auto p: ae1) ae.push_back(p); - println(hlog, "for ", tie(cw.at->id, cw.spin), " generated all_edges structure: ", ae, " of size ", isize(ae)); + if(dec & 4) { + for(auto p: ae1) ae.push_back(p); + for(auto v: visited1) visited1.push_back(v); + } + if(dec & 8) { + for(int i=0; itype; j++) { + twalker t = visited[i].first + j + wstep; + for(int s=i+1; sid, cw.spin}]; - if(ae.empty()) build_neighborhood(cw, ae, r3_neighborhood_decision); + auto& ae = decision_neighborhoods[{cw.at->id, cw.spin}]; + 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; } +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 list = { cw }; + for(auto v: ae) if(v.first != -1) + list.push_back(list[v.first] + v.second + wstep); + } + int last_qroad; vector>> possible_parents;