From 50d54bd541f96f26bbf26e1ca5ae01c8ade9e5e3 Mon Sep 17 00:00:00 2001 From: Aleksey Lobanov Date: Thu, 26 Apr 2018 03:33:56 +0300 Subject: [PATCH] Incorrect way to skip too big classess --- main.cpp | 42 +++++++++++++++++++++++++++++++----------- 1 file changed, 31 insertions(+), 11 deletions(-) diff --git a/main.cpp b/main.cpp index 1ca7438..6eaaffc 100644 --- a/main.cpp +++ b/main.cpp @@ -26,9 +26,8 @@ const CellType CUR_BASE = 3; const int ARGS_COUNT = 2; struct FunctionTask { - vector> current; - int current_max_coeff; bool is_finished; + vector> current; }; template @@ -307,14 +306,14 @@ pair>, bool> extend_function_class( new_funcs.insert(f_left); } } + new_funcs.erase(identical_x); + new_funcs.erase(identical_y); if ( new_funcs.size() == last_size ) { is_finished = true; break; } func_class.insert(new_funcs.begin(), new_funcs.end()); - func_class.erase(identical_x); - func_class.erase(identical_y); last_size = new_funcs.size(); // слишком много насчитали -- выходим @@ -357,7 +356,7 @@ vector processed_task_list; mutex processed_task_mutex; set> bad_functions; - +atomic current_max_coeff; void do_work() { std::chrono::milliseconds SLEEP_TIME(10); @@ -383,7 +382,7 @@ void do_work() { tie(task.current, task.is_finished) = extend_function_class( task.current, - get_math_coeff(task.current_max_coeff) + get_math_coeff(current_max_coeff) ); processed_task_mutex.lock(); processed_task_list.push_back(task); @@ -398,6 +397,9 @@ void process_task_lists() { cout << "processing starts " << endl; std::chrono::milliseconds SLEEP_TIME(10); + + vector local_processed_tasks; + while ( completed_tasks < total_possible_functions ) { if ( tasks_to_extend ) { // подождём, пока не закончатся таски в очереди @@ -413,7 +415,8 @@ void process_task_lists() { // опустошим выполненные таски processed_task_mutex.lock(); - vector local_processed_tasks = processed_task_list; + for (auto && task: processed_task_list) + local_processed_tasks.push_back(task); processed_task_list.clear(); processed_task_list.shrink_to_fit(); processed_task_mutex.unlock(); @@ -434,14 +437,21 @@ void process_task_lists() { } ); + // сохраним, чем должен был равняться максимальный размер + auto last_math_coeff = get_math_coeff(current_max_coeff); + // а для всех новых увеличим его + ++current_max_coeff; + for ( auto&& task: local_processed_tasks ) { + // если в каких-то больше, чем положено, то не трогаем их + if ( task.current.size() > last_math_coeff) + break; if ( !task.is_finished ) { if ( is_bad_class(task.current, bad_functions) ) { //cout << "bad class" << endl; ++completed_tasks; print_progress(completed_tasks, total_possible_functions); } else { - ++task.current_max_coeff; task_mutex.lock(); ++tasks_to_extend; task_list.push_back(task); @@ -494,7 +504,16 @@ void process_task_lists() { } } } - local_processed_tasks.clear(); + local_processed_tasks.erase( + remove_if( + local_processed_tasks.begin(), + local_processed_tasks.end(), + [last_math_coeff](const FunctionTask& task) { + return task.current.size() <= last_math_coeff; + }), + local_processed_tasks.end() + ); + local_processed_tasks.shrink_to_fit(); // Поспим, чтобы не работать слишком часто std::this_thread::sleep_for(SLEEP_TIME); @@ -534,16 +553,17 @@ int main() { FiniteFunction identical_x(string("000 111 222")); FiniteFunction identical_y(string("012 012 012")); - + cout << identical_x.get_hash() << endl; + cout << identical_y.get_hash() << endl; allowed_functions.erase(identical_x); allowed_functions.erase(identical_y); completed_tasks = 0; + current_max_coeff = 1; for (auto&& func: allowed_functions) { FunctionTask task; task.current = {func}; task.is_finished = false; - task.current_max_coeff = 1; task_list.push_back(task); }