1
0
mirror of https://github.com/zenorogue/hyperrogue.git synced 2025-12-20 04:48:06 +00:00

more efficient find_emeraldval

This commit is contained in:
Zeno Rogue
2020-01-28 19:47:41 +01:00
parent 7b6cde592b
commit d79c06e9d1

View File

@@ -1026,38 +1026,51 @@ EX namespace reg3 {
return quotient_map->allh[h->fieldval]; return quotient_map->allh[h->fieldval];
} }
unordered_map<int, int> evmemo; vector<short> evmemo;
void find_emeraldval(heptagon *target, heptagon *parent, int d) { void find_emeraldval(heptagon *target, heptagon *parent, int d) {
const int MOD = 64;
auto& cr = cgi.cellrotations; auto& cr = cgi.cellrotations;
int memo_id = parent->emeraldval * isize(quotient_map->allh) + parent->fieldval; if(evmemo.empty()) {
println(hlog, "starting");
if(false && evmemo.count(memo_id)) map<int, int> matrix_hashtable;
target->emeraldval = evmemo[memo_id]; auto matrix_hash = [] (const transmatrix& M) {
else { return bucketer(M[0][0])
int eid = parent->emeraldval / MOD; + bucketer(M[0][1]) * 71
int k0 = parent->emeraldval % MOD; + bucketer(M[0][2]) * 113
auto cpart = emerald_map->allh[eid]; + bucketer(M[1][0]) * 1301
int ed = cr[k0].mapping[d]; + bucketer(M[1][1]) * 1703
auto cpart1 = cpart->move(ed); + bucketer(M[1][2]) * 17031
int eid1 = cpart1->fieldval; + bucketer(M[2][2]) * 2307
+ bucketer(M[2][0]) * 2311
+ bucketer(M[2][1]) * 10311;
};
for(int i=0; i<isize(cr); i++) matrix_hashtable[matrix_hash(cr[i].M)] = cr[i].inverse_id;
println(hlog, "ids size = ", isize(matrix_hashtable));
transmatrix X = cr[cr[k0].inverse_id].M; for(int eid=0; eid<isize(emerald_map->allh); eid++)
for(int k0=0; k0<isize(cr); k0++)
int k1 = -1; for(int fv=0; fv<isize(quotient_map->allh); fv++) {
for(int d=0; d<S7; d++) {
for(int ik1=0; ik1<isize(cr); ik1++) { int ed = cr[k0].mapping[d];
bool ok =true; auto cpart = emerald_map->allh[eid];
auto& mX1 = cr[ik1].M; int eid1 = emerald_map->allh[eid]->move(ed)->fieldval;
for(int d1=0; d1<S7; d1++) if(!eqmatrix(adj(parent, d) * mX1, X * emerald_map->adj(cpart, ed))) const transmatrix& X = cr[cr[k0].inverse_id].M;
ok = false; transmatrix U = quotient_map->iadj(quotient_map->allh[fv], d) * X * emerald_map->adj(cpart, ed);
if(ok) k1 = cr[ik1].inverse_id; int k1 = matrix_hashtable[matrix_hash(U)];
/* for(int ik1=0; ik1<isize(cr); ik1++) {
auto& mX1 = cr[ik1].M;
if(eqmatrix(mX1, U)) k1 = cr[ik1].inverse_id;
} */
evmemo.push_back(eid1 * isize(cr) + k1);
}
} }
evmemo[memo_id] = target->emeraldval = eid1 * MOD + k1; println(hlog, "generated ", isize(evmemo));
} }
int memo_id = parent->emeraldval;
target->zebraval = emerald_map->allh[target->emeraldval / MOD]->zebraval; memo_id = memo_id * isize(quotient_map->allh) + parent->fieldval;
memo_id = memo_id * S7 + d;
target->emeraldval = evmemo[memo_id];
target->zebraval = emerald_map->allh[target->emeraldval / isize(cr)]->zebraval;
} }
heptagon *create_step(heptagon *parent, int d) override { heptagon *create_step(heptagon *parent, int d) override {