1
0
mirror of https://github.com/zenorogue/hyperrogue.git synced 2024-11-23 13:07:16 +00:00

rulegen:: added some tests to devmods

This commit is contained in:
Zeno Rogue 2021-07-29 16:18:41 +02:00
parent 4a0f688673
commit 6e1e4a7db4
2 changed files with 749 additions and 0 deletions

508
devmods/rulegen-tests.cpp Normal file
View File

@ -0,0 +1,508 @@
/* some extra routines for debugging and testing the rulegen algorithm */
#include "../hyper.h"
#include <fstream>
namespace hr {
namespace rulegen {
string testroot = "devmods/rulegen-tests/";
string testdir = testroot;
struct hrmap_testproto : hrmap {
map<heptagon*, tcell*> counterpart;
map<tcell*, heptagon*> counterpart2;
heptagon* clone(tcell *o) {
auto& h = counterpart2[o];
if(!h) {
h = tailored_alloc<heptagon> (o->type);
counterpart[h] = o;
h->zebraval = 0;
h->emeraldval = 0;
h->distance = 0;
h->cdata = nullptr;
h->c7 = newCell(o->type, h);
}
return h;
}
~hrmap_testproto() {
println(hlog, "clearing ", isize(counterpart), " heptagons from testproto");
for(auto p: counterpart) {
auto& at = p.first;
if(at->cdata) delete at->cdata;
destroy_cell(at->c7);
tailored_delete(at);
}
}
heptagon *getOrigin() override {
return clone(t_origin);
}
heptagon *create_step(heptagon *h, int d) override {
auto ch = counterpart[h];
if(!ch->move(d)) {
h->c.connect(d, &oob, 0, false);
h->c7->c.connect(d, &out_of_bounds, 0, false);
out_of_bounds.master = &oob;
oob.c7 = &out_of_bounds;
return &oob;
}
auto ch1 = ch->cmove(d);
auto d1 = ch->c.spin(d);
auto h1 = clone(ch1);
if(ch == ch1)
throw rulegen_failure("connected to self??");
if(h == h1)
throw rulegen_failure("connected to self on hept level??");
h->c.connect(d, h1, d1, false);
return h1;
}
void find_cell_connection(cell *c, int d) {
heptagon *h2 = createStep(c->master, d);
if(h2 == &oob) return;
c->c.connect(d, h2->c7,c->master->c.spin(d), c->master->c.mirror(d));
}
transmatrix adj(heptagon *h, int dir) override {
return arb::get_adj(arb::current_or_slided(), shvid(h->c7), dir, h->c.move(dir) ? h->c.spin(dir) : -1);
}
int shvid(cell *c) override {
if(!counterpart.count(c->master)) {
/* may happen while handling floorshapes */
return arb::id_of(c->master);
}
auto cc = counterpart[c->master];
return cc->id;
}
bool strict_tree_rules() { return true; }
};
reaction_t clear_debug = [] {};
map<tcell*,int> sprawl_shown;
void view_debug() {
auto m = dynamic_cast<hrmap_testproto*> (currentmap);
if(m) {
int ah = addHook(hooks_drawcell, 50, [m] (cell *c, const shiftmatrix& V) {
tcell *tc = m->counterpart[c->master];
string s;
auto label = (tc->code == MYSTERY ? "?" : its(tc->code)) + "/" + (tc->dist == MYSTERY ? "?" : its(tc->dist));
color_t col = 0xFFFFFF + 0x512960 * tc->code;
if(pointer_indices.count(tc)) label += " " + index_pointer(tc);
queuestr(V, 0.4, label, col, 1);
if(tc->parent_dir >= 0 && tc->parent_dir < tc->type) {
vid.linewidth *= 8;
queueline(V * C0, V * currentmap->adj(c, tc->parent_dir) * C0, 0xFFFFFFFF);
vid.linewidth /= 8;
}
if(sprawl_shown.count(tc))
queuepoly(V, cgi.shDisk, 0xFF0000FF);
return false;
});
vector<int> dh;
dh.push_back(addHook(hooks_o_key, 15, [m] (o_funcs& v) {
v.push_back(named_functionality("sprawl", [m] {
tcell *c = m->counterpart[centerover->master];
auto [d, id] = get_code(c);
twalker cw(c, d);
auto res = spread(get_analyzer(cw), cw);
println(hlog, "sprawl result = ", res);
sprawl_shown.clear();
for(int i=0; i<isize(res); i++) sprawl_shown[res[i].at] = i;
}));
}));
for(auto dw: debuglist)
dh.push_back(addHook(hooks_o_key, 10, [m,dw] (o_funcs& v) {
v.push_back(named_functionality(lalign(0, "go to ", dw), [dw,m] {
cwt = cellwalker(m->clone(dw.at)->c7, dw.spin, dw.mirrored);
centerover = cwt.at;
View = Id;
}));
}));
clear_debug = [ah, dh] {
delHook(hooks_drawcell, ah);
for(auto dhk: dh) delHook(hooks_o_key, dhk);
clear_debug = [] {};
};
}
else if(currentmap->strict_tree_rules()) {
int ah = addHook(hooks_drawcell, 50, [] (cell *c, const shiftmatrix& V) {
string s;
int id = get_state(c);
auto label = its(id);
color_t col = 0xFFFFFF + 0x512960 * id;
if(pointer_indices.count(c->master)) label += " " + index_pointer(c->master);
queuestr(V, 0.3, label, col, 1);
vid.linewidth *= 8;
queueline(V * C0, V * currentmap->adj(c, 0) * C0, 0xFFFFFFFF, 4);
vid.linewidth /= 8;
return false;
});
clear_debug = [ah] { delHook(hooks_drawcell, ah); };
}
}
int test_rotate_val = 0;
int test_count = 10000;
void test_rules() {
cell *c = currentmap->gamestart();
int N = isize(treestates);
if(!N) {
println(hlog, "no states generated");
return;
}
vector<bignum> howmany(N);
howmany[0] = 1;
celllister cl(c, 100, test_count, nullptr);
vector<int> bydist(64, 0);
for(cell *cc: cl.lst) {
int d = cl.getdist(cc);
if(d < 64) bydist[d]++;
}
vector<int> vals;
vector<string> seq;
for(int iter=0; iter<30; iter++) {
bignum total;
for(auto& h: howmany) total += h;
seq.push_back(total.get_str(100));
println(hlog, iter, " : ", total.get_str(100), " vs ", bydist[iter]);
if(bydist[iter] && bydist[iter] != total.approx_ll())
println(hlog, "ERROR count mismatch");
vector<bignum> next(N);
for(int id=0; id<N; id++)
for(int s: treestates[id].rules) if(s >= 0)
next[s] += howmany[id];
howmany = std::move(next);
}
println(hlog, "sequence: ", seq);
}
void list_sequence() {
int N = isize(treestates);
if(!N) {
println(hlog, "no states generated");
return;
}
vector<bignum> howmany(N);
howmany[0] = 1;
vector<string> seq;
for(int iter=0; iter<30; iter++) {
bignum total;
for(auto& h: howmany) total += h;
seq.push_back(total.get_str(100));
vector<bignum> next(N);
for(int id=0; id<N; id++)
for(int s: treestates[id].rules) if(s >= 0)
next[s] += howmany[id];
howmany = std::move(next);
}
println(hlog, "sequence: ", seq);
}
void print_rules();
string rule_name(int r) {
if(r == DIR_UNKNOWN) return "??";
else if(r == DIR_MULTI_GO_LEFT) return "ML";
else if(r == DIR_MULTI_GO_RIGHT) return "MR";
else if(r == DIR_LEFT) return "L";
else if(r == DIR_RIGHT) return "R";
else if(r == DIR_PARENT) return "P";
else return its(r);
}
void print_rules() {
for(int i=0; i<isize(treestates); i++) {
print(hlog, i, ":");
auto& ts = treestates[i];
for(auto r: ts.rules)
print(hlog, " ", rule_name(r));
if(ts.giver.at)
print(hlog, " ", get_aid(ts.giver));
else
print(hlog, " (no giver)");
println(hlog, " rg:", ts.giver, ts.is_live ? " [live]" : " [dead]");
}
}
int draw_which = 0;
void restart_game_on(hrmap *m) {
stop_game();
int a = addHook(hooks_newmap, 0, [m] { return m;});
set_geometry(gArbitrary);
start_game();
delHook(hooks_newmap, a);
}
void test_current() {
stop_game();
pointer_indices.clear();
string s = arb::in() ? arb::current.filename : full_geometry_name();
// if(s.find("884-211-045") == string::npos) return;
start_game();
string t = testdir;
for(char c: s)
if(isalnum(c)) t += c;
else if(c == ',') t += "_";
else if(c == ' ') t += "__";
else if(c == '(') t += "op";
else if(c == '(') t += "cp";
else if(c == '[') t += "ob";
else if(c == '[') t += "cb";
else if(c == '/') t += "__";
if(euclid) pconf.scale = .1;
if(hyperbolic) pconf.scale = .95;
if(sphere) pconf.scale = .5;
shot::transparent = hyperbolic;
println(hlog, "TESTING: ", s, " AS: ", t);
indenter ind(2);
if(draw_which & 1) {
View = Id; shot::take(t+"-old.png");
}
string status;
bool ok = false;
int tstart = SDL_GetTicks();
try {
generate_rules();
status = "ACC;OK";
ok = true;
}
catch(rulegen_surrender& e) {
println(hlog, "surrender: ** ", e.what());
status = s0 + "SUR;\"" + e.what() + "\"";
}
catch(rulegen_retry& e) {
println(hlog, "try exceeded: ** ", e.what());
status = s0 + "TRY;\"" + e.what() + "\"";
}
catch(rulegen_failure& e) {
println(hlog, "error: ** ", e.what());
status = s0 + "ERR;\"" + e.what() + "\"";
}
if(t_origin && (draw_which & 2)) {
restart_game_on(new hrmap_testproto);
view_debug();
View = Id; shot::take(t+"-orig.png");
clear_debug();
}
if(ok && (draw_which & 4)) {
restart_game_on(new_hrmap_rulegen());
view_debug();
View = Id; shot::take(t+"-rule.png");
clear_debug();
}
tstart = SDL_GetTicks() - tstart;
int qsolid = 0, qcode = 0, qdist = 0;
auto *c = first_tcell;
while(c) {
if(c->is_solid) qsolid++;
if(c->code != MYSTERY) qcode++;
if(c->dist != MYSTERY) qdist++;
c = c->next;
}
println(hlog, "after rulegen: tcellcount = ", tcellcount, "-", tunified, " qsolid = ", qsolid, " qdist = ", qdist, " qcode = ", qcode, " radius = ", prepare_around_radius, " try_count = ", try_count, " ticks = ", tstart);
println(hlog, "CSV;", euclid ? "E" : hyperbolic ? "H" : "?", ";", status, ";", tcellcount, ";", tunified, ";", qsolid, ";", qdist, ";", qcode, ";", prepare_around_radius, ";", try_count, ";", tstart, ";", isize(treestates), ";", arb::current.filename);
fflush(stdout);
print_rules();
/* for(auto& a: analyzers)
println(hlog, "analyzer ", a.first, " size is ", isize(a.second.spread)); */
fflush(stdout);
list_sequence();
fflush(stdout);
}
void out_reg() {
println(hlog, "X ", int(geometry), " ", int(variation), " ", int(gp::param.first), " ", int(gp::param.second));
}
void test_all_regular(vector<eGeometry> glist) {
for(eGeometry g: glist) {
set_geometry(g);
set_variation(eVariation::pure);
out_reg();
set_geometry(g);
set_variation(eVariation::bitruncated);
out_reg();
for(int a=1; a<5; a++)
for(int b=0; b<=a; b++) {
if(a==1 && b == 0) continue;
if(a==1 && b == 1 && S3 == 3) continue;
stop_game();
set_geometry(g);
gp::param = {a, b};
set_variation(eVariation::goldberg);
out_reg();
if(S3 == 4 && (geometry == g46 || ((a+b)%2 == 0))) {
stop_game();
set_variation(eVariation::unrectified);
out_reg();
}
if(S3 == 3 && (geometry == gOctagon || (a-b)%3 == 0)) {
stop_game();
set_variation(eVariation::untruncated);
out_reg();
stop_game();
set_variation(eVariation::warped);
out_reg();
}
}
}
}
void set_dir(string s) {
testdir = testroot + s;
system(("mkdir -p " + testdir).c_str());
}
void test_from_file(string list) {
set_dir("devmods/rulegen-tests/" + list);
vector<string> filenames;
std::ifstream is("devmods/rulegen-tests/" + list + ".lst");
string s;
while(getline(is, s)) {
if(s != "") filenames.push_back(s);
}
int trv = test_rotate_val;
int id = 0;
for(const string& s: filenames) {
if(trv) { trv--; id++; continue; }
stop_game();
set_geometry(gArbitrary);
try {
println(hlog, "loading ", s, "... ", id++, "/", isize(filenames));
arb::load(s);
}
catch(hr_parse_exception& ex) {
println(hlog, "failed: ", ex.s);
continue;
}
catch(arb::hr_polygon_error& ex) {
println(hlog, "poly error");
continue;
}
catch(hr_exception& ex) {
println(hlog, "other exception");
continue;
}
if(cgflags & qAFFINE) {
println(hlog, "illgeal tessellation found: affine"); continue;
}
if(sphere) {
println(hlog, "illgeal tessellation found: spherical"); continue;
}
test_current();
}
}
void test_all_geoms(int i) {
if(i&1) {
set_dir("regular/");
test_all_regular({gNormal, gOctagon, g45, g46, g47, gEuclid, gEuclidSquare});
}
}
int testargs() {
using namespace arg;
if(0) ;
else if(argis("-testproto")) {
restart_game_on(new hrmap_testproto);
println(hlog, "creatad a testproto map with ", tcellcount, " cells");
}
else if(argis("-test-this")) {
PHASEFROM(3);
try {
test_current();
}
catch(rulegen_failure& e) {
}
}
else if(argis("-test-list")) {
PHASEFROM(3);
shift();
test_from_file(args());
}
else if(argis("-test-all")) {
PHASEFROM(3);
shift();
test_all_geoms(argi());
start_game();
}
else if(argis("-trv")) {
shift(); test_rotate_val = argi();
}
else if(argis("-view-debug"))
view_debug();
else if(argis("-clear-debug"))
clear_debug();
else return 1;
return 0;
}
auto testhooks =
addHook(hooks_args, 100, testargs);
} }

View File

@ -0,0 +1,241 @@
tessellations/multitile/4-7/1+3a/1a2+3af/4-7-1a2+3af-30.tes
tessellations/other/toimine/toimine884/112/toimine884-112-076.tes
tessellations/other/toimine/toimine884/211/051-100/toimine884-211-072.tes
tessellations/pseudo-Archimedean/Euclidean/4-uniform/eu\ 666\ 666\ 3366\ 333333\ AFAS6.tes
tessellations/multitile/6-3/1+3a/6-3-1r2+3af-3.tes
tessellations/other/heavpoot-a/hp-3a+6s3b+6a1.tes
tessellations/multitile/3-6/1+3/3-6-1a+3a-3.tes
tessellations/pseudo-Archimedean/Euclidean/4-uniform/eu 4444 33344 33344 33434 A1AFF.tes
tessellations/pseudo-Archimedean/Euclidean/4-uniform/eu 33344 33434 333333 333333 FAS6S3b.tes
tessellations/pseudo-Archimedean/Euclidean/4-uniform/eu 3cc 334c 33434 333333.tes
tessellations/pseudo-Archimedean/Euclidean/4-uniform/eu 46c 3366 3446 33344.tes
tessellations/multitile/4-6/2+2/2a1+2f/001-100/4-6-2a1+2f-083.tes
tessellations/other/toimine/toimine2311/2+4/toimine2311-2+4-58.tes
tessellations/other/toimine/toimine6612/121/101-150/toimine6612-121-116.tes
tessellations/other/toimine/toimine2311/3+3/toimine2311-3+3-18.tes
tessellations/other/toimine/toimine2311/3+3/toimine2311-3+3-34.tes
tessellations/other/toimine/toimine2311/2+4/toimine2311-2+4-04.tes
tessellations/multitile/3-7/1+2+3/3-7-1f+2r+3f-19.tes
tessellations/other/toimine/toimine2311/2+4/toimine2311-2+4-51.tes
tessellations/multitile/3-8/1+2+3/1f+2f+3f/501-596/3-8-1f+2f+3f-545.tes
tessellations/other/toimine/toimine6620/211/toimine6620-211-54.tes
tessellations/other/toimine/toimine886/111/toimine886-111-08.tes
tessellations/multitile/3-8/1+2+3/1f+2f+3f/501-596/3-8-1f+2f+3f-503.tes
tessellations/other/toimine/toimine6610/121/toimine6610-121-20.tes
tessellations/other/toimine/toimine6612/211/101-150/toimine6612-211-126.tes
tessellations/polyschwartz/245/2-2 + 6-39.tes
tessellations/other/toimine/toimine6615/121/toimine6615-121-02.tes
tessellations/other/toimine/toimine6612/211/101-150/toimine6612-211-131.tes
tessellations/multitile/polyforms/schwarz/245/1-1 + 4-8 s1.tes
tessellations/other/toimine/toimine6617/113/toimine6617-113-16.tes
tessellations/multitile/polyforms/schwarz/245/2-2 + 6-39.tes
tessellations/other/toimine/toimine6618/211/151-159/toimine6618-211-151.tes
tessellations/other/toimine/toimine2311/2+4/toimine2311-2+4-16.tes
tessellations/polyschwartz/237/1-1 + 7-08.tes
tessellations/other/toimine/toimine2311/2+4/toimine2311-2+4-59.tes
tessellations/other/toimine/toimine6618/211/101-150/toimine6618-211-146.tes
tessellations/multitile/3-8/1+2+3/1f+2f+3f/501-596/3-8-1f+2f+3f-568.tes
tessellations/other/toimine/toimine6618/111/toimine6618-111-17.tes
tessellations/other/toimine/toimine6612/211/201-243/toimine6612-211-243.tes
tessellations/other/toimine/toimine2311/2+4/toimine2311-2+4-52.tes
tessellations/other/toimine/toimine885/211/toimine885-211-23.tes
tessellations/other/toimine/toimine2311/3+3/toimine2311-3+3-64.tes
tessellations/other/toimine/toimine885/211/toimine885-211-44.tes
tessellations/other/toimine/toimine2311/3+3/toimine2311-3+3-58.tes
tessellations/other/toimine/toimine6612/112/151-200/toimine6612-112-188.tes
tessellations/multitile/polyforms/schwarz/245/45 + 410/12/45 + 410 + 410 s02.tes
tessellations/other/toimine/toimine2311/2+4/toimine2311-2+4-49.tes
tessellations/multitile/3-8/1+2+3/1f+2f+3f/501-596/3-8-1f+2f+3f-564.tes
tessellations/other/toimine/toimine2311/2+4/toimine2311-2+4-42.tes
tessellations/other/toimine/toimine2311/2+4/toimine2311-2+4-03.tes
tessellations/other/toimine/toimine6610/211/toimine6610-211-13.tes
tessellations/other/toimine/toimine2311/2+4/toimine2311-2+4-36.tes
tessellations/other/toimine/toimine2311/2+4/toimine2311-2+4-22.tes
tessellations/other/toimine/toimine2311/2+4/toimine2311-2+4-57.tes
tessellations/other/toimine/toimine6618/112/toimine6618-112-002.tes
tessellations/other/toimine/toimine2311/3+3/toimine2311-3+3-60.tes
tessellations/other/toimine/toimine2311/2+4/toimine2311-2+4-06.tes
tessellations/other/toimine/toimine2311/3+3/toimine2311-3+3-53.tes
tessellations/other/toimine/toimine2311/2+4/toimine2311-2+4-02.tes
tessellations/multitile/3-8/1+2+3/1f+2a1+3f/3-8-1f+2a1+3f-44.tes
tessellations/other/toimine/toimine2311/3+3/toimine2311-3+3-57.tes
tessellations/other/toimine/toimine885/112/toimine885-112-10.tes
tessellations/other/toimine/toimine6618/211/151-159/toimine6618-211-159.tes
tessellations/other/toimine/toimine6618/211/101-150/toimine6618-211-117.tes
tessellations/other/toimine/toimine6611/112/toimine6611-112-09.tes
tessellations/other/toimine/toimine2311/2+4/toimine2311-2+4-33.tes
tessellations/other/toimine/toimine6618/211/051-100/toimine6618-211-070.tes
tessellations/other/toimine/toimine6610/112/toimine6610-112-28.tes
tessellations/other/toimine/toimine2311/2+4/toimine2311-2+4-25.tes
tessellations/other/toimine/toimine6610/211/toimine6610-211-27.tes
tessellations/multitile/3-8/1+2+3/1f+2f+3f/401-500/3-8-1f+2f+3f-425.tes
tessellations/other/toimine/toimine6617/113/toimine6617-113-13.tes
tessellations/other/toimine/toimine6612/112/051-100/toimine6612-112-082.tes
tessellations/other/toimine/toimine6620/111/toimine6620-111-09.tes
tessellations/other/toimine/toimine668/121/toimine668-121-12.tes
tessellations/other/toimine/toimine2311/3+3/toimine2311-3+3-40.tes
tessellations/multitile/3-8/1+2+3/1f+2f+3f/401-500/3-8-1f+2f+3f-496.tes
tessellations/multitile/3-8/1+2+3/1f+2f+3f/101-200/3-8-1f+2f+3f-101.tes
tessellations/other/toimine/toimine6612/112/151-200/toimine6612-112-164.tes
tessellations/other/toimine/toimine6612/211/051-100/toimine6612-211-080.tes
tessellations/other/toimine/toimine6611/121/toimine6611-121-11.tes
tessellations/other/toimine/toimine2311/2+4/toimine2311-2+4-11.tes
tessellations/other/toimine/toimine6612/211/051-100/toimine6612-211-078.tes
tessellations/other/toimine/toimine2311/2+4/toimine2311-2+4-24.tes
tessellations/other/toimine/toimine2311/3+3/toimine2311-3+3-62.tes
tessellations/other/toimine/toimine6612/121/001-050/toimine6612-121-012.tes
tessellations/multitile/3-8/1+2+3/1f+2f+3f/401-500/3-8-1f+2f+3f-424.tes
tessellations/other/toimine/toimine6617/113/toimine6617-113-12.tes
tessellations/other/toimine/toimine6615/121/toimine6615-121-19.tes
tessellations/other/toimine/toimine6612/121/201-227/toimine6612-121-226.tes
tessellations/other/toimine/toimine2311/2+4/toimine2311-2+4-12.tes
tessellations/other/toimine/toimine6620/211/toimine6620-211-19.tes
tessellations/multitile/3-8/1+2+3/1f+2f+3f/501-596/3-8-1f+2f+3f-563.tes
tessellations/other/toimine/toimine2311/3+3/toimine2311-3+3-03.tes
tessellations/other/toimine/toimine2311/2+4/toimine2311-2+4-31.tes
tessellations/other/toimine/toimine6615/211/toimine6615-211-53.tes
tessellations/other/toimine/toimine2311/4+2/toimine2311-4+2-07.tes
tessellations/other/toimine/toimine6618/211/101-150/toimine6618-211-150.tes
tessellations/other/toimine/toimine2311/3+3/toimine2311-3+3-04.tes
tessellations/other/toimine/toimine2311/2+4/toimine2311-2+4-64.tes
tessellations/multitile/polyforms/schwarz/245/1-1 + 4-8 s2.tes
tessellations/other/toimine/toimine2311/3+3/toimine2311-3+3-54.tes
tessellations/multitile/polyforms/schwarz/237/1-1 + 7-08.tes
tessellations/other/toimine/toimine6620/121/toimine6620-121-29.tes
tessellations/other/toimine/toimine2311/2+4/toimine2311-2+4-09.tes
tessellations/other/toimine/toimine2311/2+4/toimine2311-2+4-45.tes
tessellations/other/toimine/toimine6612/211/101-150/toimine6612-211-122.tes
tessellations/other/toimine/toimine6612/121/151-200/toimine6612-121-172.tes
tessellations/other/toimine/toimine6612/121/201-227/toimine6612-121-211.tes
tessellations/other/toimine/toimine6615/211/toimine6615-211-61.tes
tessellations/other/toimine/toimine6612/112/151-200/toimine6612-112-155.tes
tessellations/other/toimine/toimine6618/211/051-100/toimine6618-211-088.tes
tessellations/other/toimine/toimine6612/211/051-100/toimine6612-211-086.tes
tessellations/other/toimine/toimine6618/111/toimine6618-111-14.tes
tessellations/polyschwartz/245/1-1 + 4-8 s2.tes
tessellations/other/toimine/toimine6612/112/101-150/toimine6612-112-142.tes
tessellations/other/toimine/toimine6612/211/001-050/toimine6612-211-045.tes
tessellations/other/toimine/toimine2311/3+3/toimine2311-3+3-36.tes
tessellations/multitile/4-6/2+2/2a1+2f/001-100/4-6-2a1+2f-033.tes
tessellations/other/toimine/toimine6612/121/151-200/toimine6612-121-177.tes
tessellations/other/toimine/toimine2311/2+4/toimine2311-2+4-20.tes
tessellations/multitile/3-8/1+2+3/1f+2f+3f/401-500/3-8-1f+2f+3f-445.tes
tessellations/other/toimine/toimine6618/121/051-100/toimine6618-121-066.tes
tessellations/other/toimine/toimine6612/111/toimine6612-111-30.tes
tessellations/multitile/4-6/2+2/2f+2f/401-500/4-6-2f+2f-466.tes
tessellations/other/toimine/toimine6617/113/toimine6617-113-14.tes
tessellations/other/toimine/toimine2311/3+3/toimine2311-3+3-12.tes
tessellations/other/toimine/toimine2311/3+3/toimine2311-3+3-09.tes
tessellations/other/toimine/toimine6610/211/toimine6610-211-17.tes
tessellations/other/toimine/toimine2311/3+3/toimine2311-3+3-69.tes
tessellations/other/toimine/toimine2311/2+4/toimine2311-2+4-17.tes
tessellations/other/toimine/toimine6611/121/toimine6611-121-04.tes
tessellations/other/toimine/toimine6610/211/toimine6610-211-23.tes
tessellations/other/toimine/toimine668/211/toimine668-211-08.tes
tessellations/other/toimine/toimine2311/2+4/toimine2311-2+4-40.tes
tessellations/other/toimine/toimine6612/211/201-243/toimine6612-211-233.tes
tessellations/other/toimine/toimine2311/2+4/toimine2311-2+4-35.tes
tessellations/other/toimine/toimine6618/211/051-100/toimine6618-211-058.tes
tessellations/multitile/3-8/1+2+3/1f+2f+3f/301-400/3-8-1f+2f+3f-396.tes
tessellations/other/toimine/toimine6612/112/101-150/toimine6612-112-124.tes
tessellations/other/toimine/toimine668/112/toimine668-112-04.tes
tessellations/other/toimine/toimine2311/2+4/toimine2311-2+4-53.tes
tessellations/other/toimine/toimine2311/3+3/toimine2311-3+3-50.tes
tessellations/other/toimine/toimine2311/2+4/toimine2311-2+4-47.tes
tessellations/other/toimine/toimine2311/2+4/toimine2311-2+4-05.tes
tessellations/other/toimine/toimine668/112/toimine668-112-02.tes
tessellations/other/toimine/toimine6612/112/101-150/toimine6612-112-136.tes
tessellations/polyschwartz/245/1-1 + 5-01.tes
tessellations/other/toimine/toimine6612/112/201-250/toimine6612-112-219.tes
tessellations/other/toimine/toimine2311/2+4/toimine2311-2+4-18.tes
tessellations/multitile/polyforms/schwarz/245/1-1 + 5-01.tes
tessellations/other/toimine/toimine6618/121/101-126/toimine6618-121-114.tes
tessellations/other/toimine/toimine2311/3+3/toimine2311-3+3-51.tes
tessellations/other/toimine/toimine6618/211/051-100/toimine6618-211-060.tes
tessellations/other/toimine/toimine2311/2+4/toimine2311-2+4-21.tes
tessellations/other/toimine/toimine2311/3+3/toimine2311-3+3-37.tes
tessellations/other/toimine/toimine6612/211/201-243/toimine6612-211-232.tes
tessellations/other/toimine/toimine2311/2+4/toimine2311-2+4-08.tes
tessellations/other/toimine/toimine2311/2+4/toimine2311-2+4-15.tes
tessellations/other/toimine/toimine6620/211/toimine6620-211-36.tes
tessellations/other/toimine/toimine2311/3+3/toimine2311-3+3-45.tes
tessellations/other/toimine/toimine6618/211/101-150/toimine6618-211-129.tes
tessellations/other/toimine/toimine2311/3+3/toimine2311-3+3-70.tes
tessellations/other/toimine/toimine6610/121/toimine6610-121-16.tes
tessellations/polyschwartz/245/45 + 410/12/45 + 410 + 410 s02.tes
tessellations/multitile/polyforms/schwarz/245/1-1 + 4-8 s3.tes
tessellations/other/toimine/toimine2311/3+3/toimine2311-3+3-76.tes
tessellations/other/toimine/toimine6620/112/toimine6620-112-47.tes
tessellations/other/toimine/toimine2311/2+4/toimine2311-2+4-14.tes
tessellations/multitile/3-7/1+1+3/3-7-1f+1f+3f-20.tes
tessellations/other/toimine/toimine6618/211/051-100/toimine6618-211-065.tes
tessellations/other/toimine/toimine6610/112/toimine6610-112-06.tes
tessellations/other/toimine/toimine885/121/toimine885-121-34.tes
tessellations/other/toimine/toimine6615/211/toimine6615-211-04.tes
tessellations/other/toimine/toimine6618/121/051-100/toimine6618-121-086.tes
tessellations/multitile/3-8/1+2+3/1f+2f+3f/101-200/3-8-1f+2f+3f-169.tes
tessellations/other/toimine/toimine885/211/toimine885-211-37.tes
tessellations/other/toimine/toimine2311/3+3/toimine2311-3+3-55.tes
tessellations/other/toimine/toimine2311/4+2/toimine2311-4+2-60.tes
tessellations/multitile/4-6/2+2/2f+2f/401-500/4-6-2f+2f-447.tes
tessellations/other/toimine/toimine6612/211/051-100/toimine6612-211-059.tes
tessellations/other/toimine/toimine2311/2+4/toimine2311-2+4-61.tes
tessellations/other/toimine/toimine6620/111/toimine6620-111-07.tes
tessellations/other/toimine/toimine6618/121/051-100/toimine6618-121-056.tes
tessellations/other/toimine/toimine2311/3+3/toimine2311-3+3-48.tes
tessellations/other/toimine/toimine6612/211/101-150/toimine6612-211-125.tes
tessellations/other/toimine/toimine2311/3+3/toimine2311-3+3-47.tes
tessellations/polyschwartz/245/1-1 + 4-8 s3.tes
tessellations/other/toimine/toimine2311/2+4/toimine2311-2+4-13.tes
tessellations/other/toimine/toimine885/121/toimine885-121-25.tes
tessellations/other/toimine/toimine2311/3+3/toimine2311-3+3-59.tes
tessellations/other/toimine/toimine6615/211/toimine6615-211-44.tes
tessellations/other/toimine/toimine6612/111/toimine6612-111-26.tes
tessellations/other/toimine/toimine2311/2+4/toimine2311-2+4-26.tes
tessellations/multitile/3-8/1+2+3/1f+2f+3f/501-596/3-8-1f+2f+3f-596.tes
tessellations/other/toimine/toimine2311/3+3/toimine2311-3+3-49.tes
tessellations/other/toimine/toimine2311/4+2/toimine2311-4+2-42.tes
tessellations/other/toimine/toimine6618/211/151-159/toimine6618-211-156.tes
tessellations/other/toimine/toimine6618/121/051-100/toimine6618-121-096.tes
tessellations/other/toimine/toimine6618/121/101-126/toimine6618-121-125.tes
tessellations/other/toimine/toimine2311/3+3/toimine2311-3+3-11.tes
tessellations/other/toimine/toimine2311/3+3/toimine2311-3+3-46.tes
tessellations/other/toimine/toimine2311/2+4/toimine2311-2+4-34.tes
tessellations/other/toimine/toimine2311/2+4/toimine2311-2+4-54.tes
tessellations/other/toimine/toimine2311/2+4/toimine2311-2+4-56.tes
tessellations/other/toimine/toimine6618/211/101-150/toimine6618-211-128.tes
tessellations/multitile/3-8/1+2+3/1f+2f+3f/001-100/3-8-1f+2f+3f-091.tes
tessellations/other/toimine/toimine668/211/toimine668-211-17.tes
tessellations/other/toimine/toimine6612/112/151-200/toimine6612-112-153.tes
tessellations/other/toimine/toimine6612/112/201-250/toimine6612-112-215.tes
tessellations/other/toimine/toimine668/112/toimine668-112-28.tes
tessellations/other/toimine/toimine668/112/toimine668-112-01.tes
tessellations/other/toimine/toimine6620/121/toimine6620-121-37.tes
tessellations/other/toimine/toimine2311/2+4/toimine2311-2+4-63.tes
tessellations/other/toimine/toimine6610/211/toimine6610-211-19.tes
tessellations/other/toimine/toimine2311/2+4/toimine2311-2+4-29.tes
tessellations/other/toimine/toimine2311/2+4/toimine2311-2+4-43.tes
tessellations/other/toimine/toimine6618/121/101-126/toimine6618-121-126.tes
tessellations/other/toimine/toimine668/211/toimine668-211-19.tes
tessellations/other/toimine/toimine6612/112/101-150/toimine6612-112-140.tes
tessellations/other/toimine/toimine2311/2+4/toimine2311-2+4-30.tes
tessellations/other/toimine/toimine2311/2+4/toimine2311-2+4-32.tes
tessellations/multitile/3-11/1+1+1/3-11-1a+1a+1f-2.tes
tessellations/polyschwartz/245/1-1 + 4-8 s1.tes
tessellations/other/toimine/toimine6618/211/101-150/toimine6618-211-110.tes
tessellations/other/toimine/toimine6612/112/151-200/toimine6612-112-176.tes
tessellations/other/toimine/toimine6618/211/101-150/toimine6618-211-149.tes
tessellations/other/toimine/toimine2311/2+4/toimine2311-2+4-50.tes
tessellations/other/toimine/toimine2311/2+4/toimine2311-2+4-62.tes
tessellations/other/toimine/toimine886/211/toimine886-211-011.tes
tessellations/other/toimine/toimine6615/111/toimine6615-111-28.tes
tessellations/other/toimine/toimine2311/2+4/toimine2311-2+4-44.tes
tessellations/other/toimine/toimine2311/2+4/toimine2311-2+4-10.tes
tessellations/other/toimine/toimine2311/2+4/toimine2311-2+4-38.tes
tessellations/other/toimine/toimine2311/2+4/toimine2311-2+4-46.tes
tessellations/other/toimine/toimine6618/211/101-150/toimine6618-211-125.tes
tessellations/other/toimine/toimine6620/211/toimine6620-211-18.tes
tessellations/other/toimine/toimine668/211/toimine668-211-21.tes
tessellations/other/toimine/toimine6610/121/toimine6610-121-04.tes
tessellations/other/toimine/toimine6611/112/toimine6611-112-02.tes
tessellations/multitile/3-8/1+2+3/1f+2f+3f/501-596/3-8-1f+2f+3f-565.tes