So called 'OR' optimization (actually removal of 'complete' variable in learn)
This commit is contained in:
127
cpu-opt/main.cpp
127
cpu-opt/main.cpp
@@ -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--;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user