Improved result output

This commit is contained in:
2020-02-24 22:53:34 +03:00
parent fe354a84cb
commit 0d284b7bfc

View File

@@ -86,6 +86,7 @@ void test_function() {
assert((BoolSquareMatrix<uint16_t, 4>(0b0100011110111001).get_determinant() != 0)); assert((BoolSquareMatrix<uint16_t, 4>(0b0100011110111001).get_determinant() != 0));
assert((BoolSquareMatrix<uint16_t, 4>(0b0000110100001101).get_determinant() == 0)); assert((BoolSquareMatrix<uint16_t, 4>(0b0000110100001101).get_determinant() == 0));
assert((BoolSquareMatrix<uint16_t, 4>(0b0010101111110001).get_determinant() != 0)); assert((BoolSquareMatrix<uint16_t, 4>(0b0010101111110001).get_determinant() != 0));
cout << "self-test passed" << endl; cout << "self-test passed" << endl;
} }
@@ -125,11 +126,11 @@ vector<MyFunction> get_function_class(MyFunction f, const vector< MyMatrix >& tr
} }
set<MyFunction> transformed_res(cur_res.begin(), cur_res.end()); set<MyFunction> transformed_res(cur_res.begin(), cur_res.end());
for (auto f: cur_res) { for (auto cur_f: cur_res) {
for (auto transformation: tranformations) { for (auto transformation: tranformations) {
MyFunction linear_transformed = get_function_from_callable<Storage, ARGS_COUNT>( MyFunction linear_transformed = get_function_from_callable<Storage, ARGS_COUNT>(
[transformation, f](const BoolVector<Storage, ARGS_COUNT> vec) -> Storage { [transformation, cur_f](const BoolVector<Storage, ARGS_COUNT> vec) -> Storage {
return f.at((transformation * vec).get_value()); return cur_f.at((transformation * vec).get_value());
} }
); );
bool is_inserted = transformed_res.insert(linear_transformed).second; bool is_inserted = transformed_res.insert(linear_transformed).second;
@@ -284,27 +285,38 @@ void fill_ranks(vector<MyFunction> monomials) {
ranks.clear(); ranks.clear();
for (auto i = total_ranks - 1; i != 0; --i) for (auto i = total_ranks - 1; i != 0; --i)
ranks.push_back(vector<MyFunction>()); // empty set ranks.push_back(vector<MyFunction>()); // empty set
size_t total_unique_functions = 0;
size_t total_functions = 0; size_t total_functions = 0;
map<MyFunction, size_t> class_sizes;
for (size_t fn_value = 0; fn_value < used_map.size(); ++fn_value) { for (size_t fn_value = 0; fn_value < used_map.size(); ++fn_value) {
auto cur_rank = used_map[fn_value]; auto cur_rank = used_map[fn_value];
if ( not cur_rank ) if ( not cur_rank )
continue; continue;
++total_functions; ++total_unique_functions;
MyFunction current_fn(fn_value); MyFunction current_fn(fn_value);
vector<MyFunction> function_class = get_function_class( vector<MyFunction> function_class = get_function_class(
current_fn, possible_tranformations, f_out current_fn, possible_tranformations, f_out
); );
f_out << "size of function class " << current_fn.string() << " is " << function_class.size() << endl; f_out << "size of function class " << current_fn.string() << " is " << function_class.size() << endl;
class_sizes[current_fn] = function_class.size();
for (auto marked_function: function_class) { for (auto marked_function: function_class) {
if ( used_map[marked_function.value()] == 0 )
f_out << "already 0 at " << marked_function.string() << " " << function_formulas[marked_function.value()]
<< " from class " << current_fn.string() << " " << function_formulas[current_fn.value()] << endl;
used_map[marked_function.value()] = 0; used_map[marked_function.value()] = 0;
++total_functions;
} }
ranks.at(cur_rank - 1).push_back(current_fn); ranks.at(cur_rank - 1).push_back(current_fn);
} }
cout << "total unique functions: " << total_functions << endl; if ( total_functions != FUNCTIONS_COUNT)
cout << "total counted functions: " << total_functions
<< " but must be " << FUNCTIONS_COUNT << endl;
cout << "total function classes: " << total_unique_functions << endl;
for (size_t rank_ind = 0; rank_ind < ranks.size(); ++rank_ind) { for (size_t rank_ind = 0; rank_ind < ranks.size(); ++rank_ind) {
f_out << "rank index = " << rank_ind + 1 << endl; f_out << "rank index = " << rank_ind + 1 << endl;
for (auto f: ranks.at(rank_ind)) for (auto f: ranks.at(rank_ind))
f_out << f.string() << endl; f_out << f.string() << " size: " << class_sizes[f] << " "
<< function_formulas[f.value()] << endl;
} }
f_out.close(); f_out.close();
} }