So called 'OR' optimization (actually removal of 'complete' variable in learn)

This commit is contained in:
JCRaymond
2019-12-08 15:13:35 -05:00
parent b02eec5d1a
commit 32794a6274

View File

@@ -280,79 +280,76 @@ void learn(const Coxeter &cox, CosetTable &cosets,
const int nrels = cox.nrels; const int nrels = cox.nrels;
const int ngens = cox.ngens; const int ngens = cox.ngens;
while (true) { Gen gens[2];
bool complete = true; Ind s_i, e_i;
Cos s_c, e_c, i_c;
int g_i;
Gen g;
int lookup, idx;
#pragma omp parallel for schedule(dynamic, 1) private(gens, s_i, e_i, s_c, e_c, i_c, g_i, g, lookup, idx)
for (unsigned int r = 0; r < nrels; ++r) {
auto &table = reltables[r];
gens[0] = table.gen[0];
gens[1] = table.gen[1];
Gen gens[2]; for (unsigned int c = 0; c < table.num_rows; c++) {
#pragma omp parallel for schedule(static, 1) reduction(&:complete) private(gens) s_i = table.start_inds[c];
for (unsigned int r = 0; r < nrels; ++r) { e_i = table.end_inds[c];
auto &table = reltables[r]; s_c = table.start_cosets[c];
gens[0] = table.gen[0]; e_c = table.end_cosets[c];
gens[1] = table.gen[1]; i_c = table.init_cosets[c];
for (unsigned int c = 0; c < table.num_rows; c++) { g_i = s_i & 1;
auto s_i = table.start_inds[c]; g = gens[g_i];
auto e_i = table.end_inds[c]; while (s_i < e_i) {
auto s_c = table.start_cosets[c]; lookup = cosets[g + s_c*ngens];
auto e_c = table.end_cosets[c]; if (lookup < 0) break;
auto i_c = table.init_cosets[c]; g_i = 1-g_i;
int g_i = s_i & 1;
Gen g = gens[g_i];
while (s_i < e_i) {
const int lookup = cosets[g + s_c*ngens];
if (lookup < 0) break;
g_i = 1-g_i;
g = gens[g_i];
s_i++;
s_c = lookup;
if (s_c > i_c) {
int idx = table.coset_poss[s_c];
if (idx >= 0)
table.rem_row(idx);
}
}
table.start_inds[c] = s_i;
table.start_cosets[c] = s_c;
g_i = e_i & 1;
g = gens[g_i]; g = gens[g_i];
while (s_i < e_i) {
const int lookup = cosets[g + e_c*ngens];
if (lookup < 0) break;
g_i = 1-g_i;
g = gens[g_i];
e_i--; s_i++;
e_c = lookup; s_c = lookup;
if (e_c > i_c) { if (s_c > i_c) {
int idx = table.coset_poss[e_c]; idx = table.coset_poss[s_c];
if (idx >= 0) if (idx >= 0)
table.rem_row(idx); table.rem_row(idx);
}
}
table.end_inds[c] = e_i;
table.end_cosets[c] = e_c;
if (s_i == e_i) {
complete = false;
const int gen = gens[s_i&1];
cosets[s_c*ngens + gen] = e_c;
cosets[e_c*ngens + gen] = s_c;
table.rem_row(c);
c--;
} }
} }
}
if (complete) break; table.start_inds[c] = s_i;
table.start_cosets[c] = s_c;
g_i = e_i & 1;
g = gens[g_i];
while (s_i < e_i) {
lookup = cosets[g + e_c*ngens];
if (lookup < 0) break;
g_i = 1-g_i;
g = gens[g_i];
e_i--;
e_c = lookup;
if (e_c > i_c) {
idx = table.coset_poss[e_c];
if (idx >= 0)
table.rem_row(idx);
}
}
table.end_inds[c] = e_i;
table.end_cosets[c] = e_c;
if (s_i == e_i) {
g = gens[s_i&1];
cosets[s_c*ngens + g] = e_c;
cosets[e_c*ngens + g] = s_c;
table.rem_row(c);
c--;
}
}
} }
} }