1
0
mirror of https://github.com/zenorogue/hyperrogue.git synced 2026-01-19 01:20:23 +00:00

fieldpattern:: load found solutions from shstreams

This commit is contained in:
Zeno Rogue
2020-01-26 01:18:30 +01:00
parent 9f947c70a7
commit b58138cd94
3 changed files with 76 additions and 24 deletions

View File

@@ -307,7 +307,8 @@ struct fpattern {
vector<matrix> generate_isometries3();
int solve3();
bool generate_all3();
void set_field(int p, int sq);
// transmatrix full_R, full_P, full_X;
#if CAP_THREAD
@@ -468,6 +469,9 @@ unsigned fpattern::compute_hash() {
}
bool fpattern::generate_all3() {
reg3::generate_fulls();
matrices.clear();
matcode.clear();
add1(Id);
@@ -489,7 +493,6 @@ bool fpattern::generate_all3() {
}
int fpattern::solve3() {
reg3::generate_cellrotations();
reg3::construct_relations();
DEBB(DF_FIELD, ("generating isometries for ", Field));
@@ -551,6 +554,13 @@ int fpattern::solve3() {
return cmb;
}
void fpattern::set_field(int p, int sq) {
Prime = p;
Field = sq ? Prime*Prime : Prime;
wsquare = sq;
for(int a=0; a<MWDIM; a++) for(int b=0; b<MWDIM; b++) Id[a][b] = a==b?1:0;
}
int fpattern::solve() {
for(int a=0; a<MWDIM; a++) for(int b=0; b<MWDIM; b++) Id[a][b] = a==b?1:0;
@@ -1063,6 +1073,9 @@ EX fpattern current_quotient_field = fpattern(0);
EX fpattern fp_invalid = fpattern(0);
EX bool quotient_field_changed;
// these strings contain \x00
#define STR(x) string(x, sizeof(x))
EX struct fpattern& getcurrfp() {
if(geometry == gFieldQuotient && quotient_field_changed)
return current_quotient_field;
@@ -1075,17 +1088,21 @@ EX struct fpattern& getcurrfp() {
// 260 cells, hash = 72414D0C (not 0C62E214)
static fpattern fp(0);
if(fp.Prime) return fp;
fp.Prime = 5; fp.force_hash = 0x72414D0C; fp.solve();
// fp.Prime = 11; fp.force_hash = 0x5FC4CFF0; fp.solve();
// fp.Prime = 5; fp.force_hash = 0x72414D0C; fp.solve();
// fp.Prime = 11; fp.force_hash = 0x5FC4CFF0; fp.solve();
shstream ins(STR("\x05\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00\xfc\xff\xff\xff\x01\x00\x00\x00\x04\x00\x00\x00\xfc\xff\xff\xff\x04\x00\x00\x00\xfe\xff\xff\xff\x00\x00\x00\x00\x01\x00\x00\x00\xfe\xff\xff\xff\x04\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x04\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\xfc\xff\xff\xff\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\xfc\xff\xff\xff\x02\x00\x00\x00\x00\x00\x00\x00\xfc\xff\xff\xff\x01\x00\x00\x00\xfd\xff\xff\xff\x00\x00\x00\x00\x02\x00\x00\x00\xfd\xff\xff\xff\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00"));
hread_fpattern(ins, fp);
return fp;
}
if(geometry == gSpace435) {
// 650 cells, hash = EB201050
static fpattern fp(0);
if(fp.Prime) return fp;
fp.Prime = 5; fp.force_hash = 0x72414D0C; fp.solve();
// fp.Prime = 5; fp.force_hash = 0xEB201050; fp.solve();
// what is 0x72414D0C??
// fp.Prime = 11; fp.force_hash = 0x65CE0C00; fp.solve();
shstream ins(STR("\x05\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\xfc\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff\xfc\xff\xff\xff\x04\x00\x00\x00\x02\x00\x00\x00\x04\x00\x00\x00\xff\xff\xff\xff\x02\x00\x00\x00\x03\x00\x00\x00\x03\x00\x00\x00\xfd\xff\xff\xff\x01\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\xfc\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\xfd\xff\xff\xff\xfd\xff\xff\xff\x00\x00\x00\x00\xfd\xff\xff\xff\x02\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\xfd\xff\xff\xff\x03\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00"));
hread_fpattern(ins, fp);
return fp;
}
if(geometry == gSpace336) {
@@ -1094,7 +1111,9 @@ EX struct fpattern& getcurrfp() {
// 9408 cells in C4089F34
static fpattern fp(0);
if(fp.Prime) return fp;
fp.Prime = 7; fp.force_hash = 0xE3F6B7BCu; fp.solve();
// fp.Prime = 7; fp.force_hash = 0xE3F6B7BCu; fp.solve();
shstream ins(STR("\x07\x00\x00\x00\x03\x00\x00\x00\xfa\xff\xff\xff\x02\x00\x00\x00\x03\x00\x00\x00\x06\x00\x00\x00\x02\x00\x00\x00\xfe\xff\xff\xff\xfb\xff\xff\xff\xfc\xff\xff\xff\x03\x00\x00\x00\xfb\xff\xff\xff\xfd\xff\xff\xff\xfb\xff\xff\xff\x01\x00\x00\x00\xfd\xff\xff\xff\xfe\xff\xff\xff\xfd\xff\xff\xff\x03\x00\x00\x00\x00\x00\x00\x00\xfd\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfc\xff\xff\xff\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\xfa\xff\xff\xff\xfb\xff\xff\xff\x00\x00\x00\x00\xfa\xff\xff\xff\x02\x00\x00\x00\x06\x00\x00\x00\x00\x00\x00\x00\xfb\xff\xff\xff\x06\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00"));
hread_fpattern(ins, fp);
return fp;
}
if(geometry == gSpace344) {
@@ -1145,6 +1164,8 @@ EX struct fpattern& getcurrfp() {
return fp_invalid;
}
#undef STR
// todo undefined behavior
EX int subpathid = currfp.matcode[currfp.strtomatrix("RRRPRRRRRPRRRP")];
EX int subpathorder = currfp.order(currfp.matrices[subpathid]);
@@ -1289,5 +1310,23 @@ EX int currfp_get_R() { return currfp.matcode[currfp.R]; }
EX int currfp_get_P() { return currfp.matcode[currfp.P]; }
EX int currfp_get_X() { return currfp.matcode[currfp.X]; }
EX void hread_fpattern(hstream& hs, fieldpattern::fpattern& fp) {
hread(hs, fp.Prime);
hread(hs, fp.wsquare);
hread(hs, fp.P);
hread(hs, fp.R);
hread(hs, fp.X);
fp.set_field(fp.Prime, fp.wsquare);
fp.generate_all3();
}
EX void hwrite_fpattern(hstream& hs, fieldpattern::fpattern& fp) {
hwrite(hs, fp.Prime);
hwrite(hs, fp.wsquare);
hwrite(hs, fp.P);
hwrite(hs, fp.R);
hwrite(hs, fp.X);
}
}
#endif