diff --git a/rulegen.cpp b/rulegen.cpp index daa70e21..faef0515 100644 --- a/rulegen.cpp +++ b/rulegen.cpp @@ -96,7 +96,7 @@ static const flagtype w_r3_no_road_shortcuts = Flag(36); /*< consider all errors /** these control the output */ EX flagtype rdebug_flags; -EX int honeycomb_value = 1; /* how far to build local for honeycombs */ +EX int r3_neighborhood_decision = 1; /* how far to build local for honeycombs */ EX flagtype flags = 0; @@ -1366,8 +1366,8 @@ EX void id_at_spin(twalker cw, vector& sprawl, vector& a = alloc_analyzer(); } states.push_back(a); - if(WDIM == 3 && honeycomb_value) { - auto& ae = check_all_edges(cw, a, isize(sprawl)); + if(WDIM == 3 && r3_neighborhood_decision) { + auto& ae = get_decision_neighborhood(cw); int id = isize(sprawl); if(id < isize(ae)) { a->id = ae[id].first; @@ -2505,7 +2505,7 @@ auto hooks = addHook(hooks_configfile, 100, [] { param_i(max_ignore_level_post, "max_ignore_level_post"); param_i(max_ignore_time_pre, "max_ignore_time_pre"); param_i(max_ignore_time_post, "max_ignore_time_post"); - param_i(honeycomb_value, "honeycomb_value"); + param_i(r3_neighborhood_decision, "r3_neighborhood_decision"); }); EX void parse_treestate(arb::arbi_tiling& c, exp_parser& ep) { diff --git a/rulegen3.cpp b/rulegen3.cpp index a24a30e1..21251af1 100644 --- a/rulegen3.cpp +++ b/rulegen3.cpp @@ -145,48 +145,54 @@ EX int get_roadsign(twalker what) { return roadsign_id[result] = next_roadsign_id--; } -map, vector> > all_edges; +#if HDR +using neighborhood = vector>; +#endif -EX vector>& check_all_edges(twalker cw, analyzer_state* a, int id) { - auto& ae = all_edges[{cw.at->id, cw.spin}]; - if(ae.empty()) { - set seen; - vector > visited; - vector> ae1; - auto visit = [&] (twalker tw, const transmatrix& T, int id, int dir) { - if(seen.count(tw.at)) return; - seen.insert(tw.at); - auto& sh0 = currentmap->get_cellshape(tcell_to_cell[cw.at]); - auto& sh1 = currentmap->get_cellshape(tcell_to_cell[tw.at]); - int common = 0; - vector kleinized; - vector rotated; - for(auto v: sh0.vertices_only) kleinized.push_back(kleinize(sh0.from_cellcenter * v)); - for(auto w: sh1.vertices_only) rotated.push_back(kleinize(T*sh1.from_cellcenter * w)); - - for(auto v: kleinized) - for(auto w: rotated) - if(sqhypot_d(MDIM, v-w) < 1e-6) - common++; - if(honeycomb_value >= 2) { - if(common < 1) { ae1.emplace_back(id, dir); return; } - } - else { - if(common < 2) { ae1.emplace_back(id, dir); return; } - } - visited.emplace_back(tw, T); - ae.emplace_back(id, dir); - }; - visit(cw, Id, -1, -1); - for(int i=0; itype; j++) { - visit(tw + j + wstep, visited[i].second * currentmap->adj(tcell_to_cell[tw.at], (tw+j).spin), i, j); - } +map, neighborhood> all_edges; + +EX void build_neighborhood(twalker cw, neighborhood& ae, flagtype dec) { + set seen; + vector > visited; + vector> ae1; + auto visit = [&] (twalker tw, const transmatrix& T, int id, int dir) { + if(seen.count(tw.at)) return; + seen.insert(tw.at); + auto& sh0 = currentmap->get_cellshape(tcell_to_cell[cw.at]); + auto& sh1 = currentmap->get_cellshape(tcell_to_cell[tw.at]); + int common = 0; + vector kleinized; + vector rotated; + for(auto v: sh0.vertices_only) kleinized.push_back(kleinize(sh0.from_cellcenter * v)); + for(auto w: sh1.vertices_only) rotated.push_back(kleinize(T*sh1.from_cellcenter * w)); + + for(auto v: kleinized) + for(auto w: rotated) + if(sqhypot_d(MDIM, v-w) < 1e-6) + common++; + if(dec & 2) { + if(common < 1) { ae1.emplace_back(id, dir); return; } + } + else { + if(common < 2) { ae1.emplace_back(id, dir); return; } + } + visited.emplace_back(tw, T); + ae.emplace_back(id, dir); + }; + visit(cw, Id, -1, -1); + for(int i=0; itype; j++) { + visit(tw + j + wstep, visited[i].second * currentmap->adj(tcell_to_cell[tw.at], (tw+j).spin), i, j); } - if(honeycomb_value >= 3) 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); + println(hlog, "for ", tie(cw.at->id, cw.spin), " generated all_edges structure: ", ae, " of size ", isize(ae)); + } + +EX neighborhood& get_decision_neighborhood(twalker cw) { + auto& ae = all_edges[{cw.at->id, cw.spin}]; + if(ae.empty()) build_neighborhood(cw, ae, r3_neighborhood_decision); return ae; }