feat: Добавлена поддержка генерации всех представлений всех функций
This commit is contained in:
29
main.cpp
29
main.cpp
@@ -18,9 +18,15 @@ const size_t ARGS_COUNT = 4;
|
|||||||
const size_t FUNCTION_LEN = 1ll << ARGS_COUNT;
|
const size_t FUNCTION_LEN = 1ll << ARGS_COUNT;
|
||||||
const size_t FUNCTIONS_COUNT = 1ll << FUNCTION_LEN;
|
const size_t FUNCTIONS_COUNT = 1ll << FUNCTION_LEN;
|
||||||
const bool ONLY_CREATE_CLASSES = false;
|
const bool ONLY_CREATE_CLASSES = false;
|
||||||
|
const bool GENERATE_ALL_REPRESENTATIONS = true;
|
||||||
typedef Function<Storage, FUNCTION_LEN> MyFunction;
|
typedef Function<Storage, FUNCTION_LEN> MyFunction;
|
||||||
typedef BoolSquareMatrix<Storage, ARGS_COUNT> MyMatrix;
|
typedef BoolSquareMatrix<Storage, ARGS_COUNT> MyMatrix;
|
||||||
|
|
||||||
|
static_assert(
|
||||||
|
GENERATE_ALL_REPRESENTATIONS || !ONLY_CREATE_CLASSES,
|
||||||
|
"representations required NOT ONLY_CREATE_CLASSES"
|
||||||
|
);
|
||||||
|
|
||||||
map<Storage, string> function_formulas;
|
map<Storage, string> function_formulas;
|
||||||
|
|
||||||
void test_function() {
|
void test_function() {
|
||||||
@@ -131,6 +137,11 @@ vector< MyMatrix > get_good_matrices() {
|
|||||||
|
|
||||||
vector<MyFunction> get_function_class(MyFunction f, const vector< MyMatrix >& tranformations, ostream& out) {
|
vector<MyFunction> get_function_class(MyFunction f, const vector< MyMatrix >& tranformations, ostream& out) {
|
||||||
set<MyFunction> cur_res;
|
set<MyFunction> cur_res;
|
||||||
|
if constexpr ( GENERATE_ALL_REPRESENTATIONS ) {
|
||||||
|
// Тут достаточно использовать функциональный класс из одной функции.
|
||||||
|
// Хорошо работает для k=4 и меньше
|
||||||
|
return vector<MyFunction>{f};
|
||||||
|
}
|
||||||
for (Storage i = 0; i < FUNCTION_LEN; ++i) {
|
for (Storage i = 0; i < FUNCTION_LEN; ++i) {
|
||||||
MyFunction cur_f = f;
|
MyFunction cur_f = f;
|
||||||
for (Storage arg_ind = 0; arg_ind < ARGS_COUNT; ++arg_ind)
|
for (Storage arg_ind = 0; arg_ind < ARGS_COUNT; ++arg_ind)
|
||||||
@@ -335,7 +346,12 @@ void fill_ranks(vector<MyFunction> monomials) {
|
|||||||
--functions_remains;
|
--functions_remains;
|
||||||
used_map.at(el.value()) = 1;
|
used_map.at(el.value()) = 1;
|
||||||
}
|
}
|
||||||
size_t total_ranks = recover_ranks(ranks, used_map, functions_remains);
|
|
||||||
|
size_t total_ranks = 2;
|
||||||
|
if constexpr ( ONLY_CREATE_CLASSES ) {
|
||||||
|
total_ranks = recover_ranks(ranks, used_map, functions_remains);
|
||||||
|
}
|
||||||
|
|
||||||
clean_trash_ranks(ranks);
|
clean_trash_ranks(ranks);
|
||||||
cout << "recovered to " << total_ranks << endl;
|
cout << "recovered to " << total_ranks << endl;
|
||||||
cout << "current ranks: " << endl;
|
cout << "current ranks: " << endl;
|
||||||
@@ -405,7 +421,7 @@ void fill_ranks(vector<MyFunction> monomials) {
|
|||||||
<< "\\hline" << endl
|
<< "\\hline" << endl
|
||||||
<< "\\endlastfoot" << endl
|
<< "\\endlastfoot" << endl
|
||||||
<< "\\hline" << endl
|
<< "\\hline" << endl
|
||||||
<< "Номер класса & Длина & Размер класса & Полином\\\\" << endl
|
<< "Номер класса & Длина & Размер класса & ПСПФ\\\\" << endl
|
||||||
<< "\\hline" << endl;
|
<< "\\hline" << endl;
|
||||||
|
|
||||||
ranks.clear();
|
ranks.clear();
|
||||||
@@ -423,7 +439,7 @@ void fill_ranks(vector<MyFunction> monomials) {
|
|||||||
vector<MyFunction> function_class = get_function_class(
|
vector<MyFunction> function_class = get_function_class(
|
||||||
current_fn, possible_tranformations, cout
|
current_fn, possible_tranformations, cout
|
||||||
);
|
);
|
||||||
cout << "size of function class " << current_fn.string() << " is " << function_class.size() << endl;
|
// cout << "size of function class " << current_fn.string() << " is " << function_class.size() << endl;
|
||||||
class_sizes[current_fn] = function_class.size();
|
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 )
|
if ( used_map[marked_function.value()] == 0 )
|
||||||
@@ -477,5 +493,12 @@ int main() {
|
|||||||
cout << "Monomials: " << monomials.size() << endl;
|
cout << "Monomials: " << monomials.size() << endl;
|
||||||
|
|
||||||
fill_ranks(monomials);
|
fill_ranks(monomials);
|
||||||
|
|
||||||
|
if constexpr ( GENERATE_ALL_REPRESENTATIONS ) {
|
||||||
|
ofstream f_out(("functions_strings_" + to_string(ARGS_COUNT) + ".txt").c_str());
|
||||||
|
for (size_t i = 0; i < FUNCTIONS_COUNT; ++i) {
|
||||||
|
f_out << function_formulas[i] << "\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user