From 88f1c5dbf43c07bac312f84d2b8c2a102c1d095f Mon Sep 17 00:00:00 2001 From: David Allemang Date: Sat, 26 Feb 2022 00:13:39 -0500 Subject: [PATCH] WIP: Oversimplify reltables --- tc/src/solve.cpp | 84 ++++++++++++++---------------------------------- 1 file changed, 25 insertions(+), 59 deletions(-) diff --git a/tc/src/solve.cpp b/tc/src/solve.cpp index 0c144f0..5cc6d28 100644 --- a/tc/src/solve.cpp +++ b/tc/src/solve.cpp @@ -2,68 +2,34 @@ #include -namespace tc { - struct RelTablesRow { - int *gnrs; - int **lst_ptrs; +namespace { + using namespace tc; - RelTablesRow(int N, int *gnrs, int **lst_ptrs) : gnrs(gnrs), lst_ptrs(lst_ptrs) { - for (int i = 0; i < N; i++) { - lst_ptrs[i] = nullptr; - } + struct Row { + std::vector gnrs; + std::vector lst_ptrs; + + Row(int num_tables) + : gnrs(num_tables, 0), lst_ptrs(num_tables, nullptr) { } }; - struct RelTables { - static const int ROW_BLOCK_SIZE = 64; + struct Tables { std::vector rels; - std::vector rows; - int start = 0; + std::vector rows; int num_tables; - int buffer_rows = 0; - explicit RelTables(const std::vector &rels) + explicit Tables(const std::vector &rels) : num_tables(rels.size()), rels(rels) { } void add_row() { - if (buffer_rows == 0) { - int *gnrs_alloc = new int[num_tables * RelTables::ROW_BLOCK_SIZE]; - int **lst_ptrs_alloc = new int *[num_tables * RelTables::ROW_BLOCK_SIZE]; - for (int i = 0; i < RelTables::ROW_BLOCK_SIZE; i++) { - rows.push_back( - new RelTablesRow(num_tables, &gnrs_alloc[i * num_tables], &lst_ptrs_alloc[i * num_tables])); - } - buffer_rows = RelTables::ROW_BLOCK_SIZE; - } - - buffer_rows--; - } - - void del_rows_to(int idx) { - const int del_to = (idx / RelTables::ROW_BLOCK_SIZE) * RelTables::ROW_BLOCK_SIZE; - for (int i = start; i < del_to; i += RelTables::ROW_BLOCK_SIZE) { - delete[] rows[i]->gnrs; - delete[] rows[i]->lst_ptrs; - for (int j = 0; j < RelTables::ROW_BLOCK_SIZE; j++) { - delete rows[i + j]; - } - start += RelTables::ROW_BLOCK_SIZE; - } - } - - ~RelTables() { - while (start < rows.size()) { - delete[] rows[start]->gnrs; - delete[] rows[start]->lst_ptrs; - for (int j = 0; j < RelTables::ROW_BLOCK_SIZE; j++) { - delete rows[start + j]; - } - start += RelTables::ROW_BLOCK_SIZE; - } + rows.emplace_back(num_tables); } }; +} +namespace tc { Cosets Group::solve(const std::vector &sub_gens) const { Cosets cosets(ngens); cosets.add_row(); @@ -72,15 +38,15 @@ namespace tc { return cosets; } - for (int g : sub_gens) { + for (int g: sub_gens) { if (g < ngens) cosets.put(0, g, 0); } - RelTables rel_tables(rels()); + Tables rel_tables(rels()); std::vector> gen_map(ngens); int rel_idx = 0; - for (Rel m : rels()) { + for (Rel m: rels()) { gen_map[m.gens[0]].push_back(rel_idx); gen_map[m.gens[1]].push_back(rel_idx); rel_idx++; @@ -88,7 +54,7 @@ namespace tc { int null_lst_ptr; rel_tables.add_row(); - RelTablesRow &row = *(rel_tables.rows[0]); + Row &row = rel_tables.rows[0]; for (int table_idx = 0; table_idx < rel_tables.num_tables; table_idx++) { Rel &ti = rel_tables.rels[table_idx]; @@ -108,7 +74,7 @@ namespace tc { idx++; if (idx == cosets.data.size()) { - rel_tables.del_rows_to(idx / ngens); +// rel_tables.del_rows_to(idx / ngens); break; } @@ -122,9 +88,9 @@ namespace tc { coset = idx / ngens; gen = idx % ngens; - rel_tables.del_rows_to(coset); +// rel_tables.del_rows_to(coset); - RelTablesRow &target_row = *(rel_tables.rows[target]); + Row &target_row = rel_tables.rows[target]; while (!facts.empty()) { fact_idx = facts.back(); facts.pop_back(); @@ -138,12 +104,12 @@ namespace tc { gen = fact_idx % ngens; if (target == coset) - for (int table_idx : gen_map[gen]) + for (int table_idx: gen_map[gen]) if (target_row.lst_ptrs[table_idx] == nullptr) target_row.gnrs[table_idx] = -1; - RelTablesRow &coset_row = *(rel_tables.rows[coset]); - for (int table_idx : gen_map[gen]) { + Row &coset_row = rel_tables.rows[coset]; + for (int table_idx: gen_map[gen]) { if (target_row.lst_ptrs[table_idx] == nullptr) { Rel &ti = rel_tables.rels[table_idx]; target_row.lst_ptrs[table_idx] = coset_row.lst_ptrs[table_idx]; @@ -174,7 +140,7 @@ namespace tc { if (target_row.lst_ptrs[table_idx] == nullptr) { if ((cosets.get(target, ti.gens[0]) != target) and (cosets.get(target, ti.gens[1]) != target)) { - target_row.lst_ptrs[table_idx] = new int; + target_row.lst_ptrs[table_idx] = new int; // todo slow; memory leak. target_row.gnrs[table_idx] = 0; } else { target_row.lst_ptrs[table_idx] = &null_lst_ptr;