From e386cc3c1061517efd0da2667caae81ce1b7da7a Mon Sep 17 00:00:00 2001 From: Stefan Vigerske Date: Mon, 8 May 2023 11:19:24 +0200 Subject: [PATCH 1/7] fix use of SCIPgetProbvarLinearSum() in nauty and sassy interfaces - same bug as fixed for bliss in 6710423d: number of variables was not passed correctly to SCIPgetProbvarLinearSum() - also rename variables for better readability and consistency (cherry picked from commit 1982a12c3465ad0ec1ad190f14a4daf7d2cc9259) --- src/symmetry/compute_symmetry_nauty.c | 40 ++++++++++++----------- src/symmetry/compute_symmetry_sassy.cpp | 42 +++++++++++++------------ 2 files changed, 43 insertions(+), 39 deletions(-) diff --git a/src/symmetry/compute_symmetry_nauty.c b/src/symmetry/compute_symmetry_nauty.c index 35fbb2be87..98895e0d66 100644 --- a/src/symmetry/compute_symmetry_nauty.c +++ b/src/symmetry/compute_symmetry_nauty.c @@ -550,7 +550,7 @@ SCIP_RETCODE determineGraphSize( int maxischildofsum; int numvisitednodes = 0; int numischildofsum = 0; - int nvars; + int varssize; int i; conss = SCIPconshdlrGetConss(conshdlr); @@ -565,7 +565,7 @@ SCIP_RETCODE determineGraphSize( SCIP_CALL( SCIPallocBlockMemoryArray(scip, &ischildofsum, maxischildofsum) ); /* get number of variables */ - nvars = SCIPgetNVars(scip); + varssize = SCIPgetNVars(scip); /* iterate over all expressions and add the corresponding nodes to the graph */ for (i = 0; i < nconss; ++i) @@ -610,29 +610,30 @@ SCIP_RETCODE determineGraphSize( else { SCIP_Real constant = 0.0; - int varsize; + int nvars; int requiredsize; int k; if ( vars == NULL ) { - SCIP_CALL( SCIPallocBlockMemoryArray(scip, &vars, nvars) ); - SCIP_CALL( SCIPallocBlockMemoryArray(scip, &vals, nvars) ); + SCIP_CALL( SCIPallocBlockMemoryArray(scip, &vars, varssize) ); + SCIP_CALL( SCIPallocBlockMemoryArray(scip, &vals, varssize) ); } assert( vars != NULL && vals != NULL ); vars[0] = var; vals[0] = 1.0; + nvars = 1; - SCIP_CALL( SCIPgetProbvarLinearSum(scip, vars, vals, &varsize, varsize, &constant, &requiredsize, TRUE) ); - assert( requiredsize <= nvars ); + SCIP_CALL( SCIPgetProbvarLinearSum(scip, vars, vals, &nvars, varssize, &constant, &requiredsize, TRUE) ); + assert( requiredsize <= varssize ); assert( numvisitednodes > 0 ); parentnode = visitednodes[numvisitednodes-1]; assert( parentnode < *nnodes ); /* create nodes for all aggregation variables and coefficients and connect them to the parent node */ - for (k = 0; k < requiredsize; ++k) + for (k = 0; k < nvars; ++k) { int internode; @@ -814,8 +815,8 @@ SCIP_RETCODE determineGraphSize( assert( numvisitednodes == 0 ); assert( numischildofsum == 0 ); } - SCIPfreeBlockMemoryArrayNull(scip, &vals, nvars); - SCIPfreeBlockMemoryArrayNull(scip, &vars, nvars); + SCIPfreeBlockMemoryArrayNull(scip, &vals, varssize); + SCIPfreeBlockMemoryArrayNull(scip, &vars, varssize); SCIPfreeBlockMemoryArray(scip, &visitednodes, maxvisitednodes); SCIPfreeBlockMemoryArray(scip, &ischildofsum, maxischildofsum); @@ -912,7 +913,7 @@ SCIP_RETCODE fillGraphByConss( int nmaxinternodes; int oldcolor = -1; int cnt; - int nvars; + int varssize; #ifndef NDEBUG SCIP_Real oldcoef = SCIP_INVALID; #endif @@ -1135,7 +1136,7 @@ SCIP_RETCODE fillGraphByConss( SCIP_CALL( SCIPallocBlockMemoryArray(scip, &ischildofsum, maxischildofsum) ); /* get number of variables */ - nvars = SCIPgetNVars(scip); + varssize = SCIPgetNVars(scip); /* iterate over all expressions and add the corresponding nodes to the graph */ for (i = 0; i < nconss; ++i) @@ -1179,21 +1180,22 @@ SCIP_RETCODE fillGraphByConss( else { SCIP_Real constant = 0.0; - int varsize; + int nvars; int requiredsize; int k; if ( vars == NULL ) { - SCIP_CALL( SCIPallocBlockMemoryArray(scip, &vars, nvars) ); - SCIP_CALL( SCIPallocBlockMemoryArray(scip, &vals, nvars) ); + SCIP_CALL( SCIPallocBlockMemoryArray(scip, &vars, varssize) ); + SCIP_CALL( SCIPallocBlockMemoryArray(scip, &vals, varssize) ); } assert( vars != NULL && vals != NULL ); vars[0] = var; vals[0] = 1.0; + nvars = 1; - SCIP_CALL( SCIPgetProbvarLinearSum(scip, vars, vals, &varsize, varsize, &constant, &requiredsize, TRUE) ); + SCIP_CALL( SCIPgetProbvarLinearSum(scip, vars, vals, &nvars, varssize, &constant, &requiredsize, TRUE) ); assert( requiredsize <= nvars ); assert( numvisitednodes > 0 ); @@ -1201,7 +1203,7 @@ SCIP_RETCODE fillGraphByConss( assert( parentnode < nnodes ); /* create nodes for all aggregation variables and coefficients and connect them to the parent node */ - for (k = 0; k < requiredsize; ++k) + for (k = 0; k < nvars; ++k) { SYM_CONSTTYPE* ct; int internode; @@ -1532,8 +1534,8 @@ SCIP_RETCODE fillGraphByConss( #endif /* free everything */ - SCIPfreeBlockMemoryArrayNull(scip, &vals, nvars); - SCIPfreeBlockMemoryArrayNull(scip, &vars, nvars); + SCIPfreeBlockMemoryArrayNull(scip, &vals, varssize); + SCIPfreeBlockMemoryArrayNull(scip, &vars, varssize); SCIPfreeBlockMemoryArray(scip, &pos, nnodes); SCIPfreeBlockMemoryArray(scip, &visitednodes, maxvisitednodes); diff --git a/src/symmetry/compute_symmetry_sassy.cpp b/src/symmetry/compute_symmetry_sassy.cpp index da659396e2..c1d7640c2d 100644 --- a/src/symmetry/compute_symmetry_sassy.cpp +++ b/src/symmetry/compute_symmetry_sassy.cpp @@ -477,7 +477,7 @@ SCIP_RETCODE determineGraphSize( int maxischildofsum; int numvisitednodes = 0; int numischildofsum = 0; - int nvars; + int varssize; int i; conss = SCIPconshdlrGetConss(conshdlr); @@ -492,7 +492,7 @@ SCIP_RETCODE determineGraphSize( SCIP_CALL( SCIPallocBlockMemoryArray(scip, &ischildofsum, maxischildofsum) ); /* get number of variables */ - nvars = SCIPgetNVars(scip); + varssize = SCIPgetNVars(scip); /* iterate over all expressions and add the corresponding nodes to the graph */ for (i = 0; i < nconss; ++i) @@ -537,29 +537,30 @@ SCIP_RETCODE determineGraphSize( else { SCIP_Real constant = 0.0; - int varsize; + int nvars; int requiredsize; int k; if ( vars == NULL ) { - SCIP_CALL( SCIPallocBlockMemoryArray(scip, &vars, nvars) ); - SCIP_CALL( SCIPallocBlockMemoryArray(scip, &vals, nvars) ); + SCIP_CALL( SCIPallocBlockMemoryArray(scip, &vars, varssize) ); + SCIP_CALL( SCIPallocBlockMemoryArray(scip, &vals, varssize) ); } assert( vars != NULL && vals != NULL ); vars[0] = var; vals[0] = 1.0; + nvars = 1; - SCIP_CALL( SCIPgetProbvarLinearSum(scip, vars, vals, &varsize, nvars, &constant, &requiredsize, TRUE) ); - assert( requiredsize <= nvars ); + SCIP_CALL( SCIPgetProbvarLinearSum(scip, vars, vals, &nvars, varssize, &constant, &requiredsize, TRUE) ); + assert( requiredsize <= varssize ); assert( numvisitednodes > 0 ); parentnode = visitednodes[numvisitednodes-1]; assert( parentnode < *nnodes ); /* create nodes for all aggregation variables and coefficients and connect them to the parent node */ - for (k = 0; k < requiredsize; ++k) + for (k = 0; k < nvars; ++k) { int internode; @@ -741,8 +742,8 @@ SCIP_RETCODE determineGraphSize( assert( numvisitednodes == 0 ); assert( numischildofsum == 0 ); } - SCIPfreeBlockMemoryArrayNull(scip, &vals, nvars); - SCIPfreeBlockMemoryArrayNull(scip, &vars, nvars); + SCIPfreeBlockMemoryArrayNull(scip, &vals, varssize); + SCIPfreeBlockMemoryArrayNull(scip, &vars, varssize); SCIPfreeBlockMemoryArray(scip, &visitednodes, maxvisitednodes); SCIPfreeBlockMemoryArray(scip, &ischildofsum, maxischildofsum); @@ -836,7 +837,7 @@ SCIP_RETCODE fillGraphByConss( int rhsarraysize; int nmaxinternodes; int oldcolor = -1; - int nvars; + int varssize; #ifndef NDEBUG SCIP_Real oldcoef = SCIP_INVALID; #endif @@ -1040,7 +1041,7 @@ SCIP_RETCODE fillGraphByConss( SCIP_CALL( SCIPallocBlockMemoryArray(scip, &ischildofsum, maxischildofsum) ); /* get number of variables */ - nvars = SCIPgetNVars(scip); + varssize = SCIPgetNVars(scip); /* iterate over all expressions and add the corresponding nodes to the graph */ for (i = 0; i < nconss; ++i) @@ -1084,29 +1085,30 @@ SCIP_RETCODE fillGraphByConss( else { SCIP_Real constant = 0.0; - int varsize; + int nvars; int requiredsize; int k; if ( vars == NULL ) { - SCIP_CALL( SCIPallocBlockMemoryArray(scip, &vars, nvars) ); - SCIP_CALL( SCIPallocBlockMemoryArray(scip, &vals, nvars) ); + SCIP_CALL( SCIPallocBlockMemoryArray(scip, &vars, varssize) ); + SCIP_CALL( SCIPallocBlockMemoryArray(scip, &vals, varssize) ); } assert( vars != NULL && vals != NULL ); vars[0] = var; vals[0] = 1.0; + nvars = 1; - SCIP_CALL( SCIPgetProbvarLinearSum(scip, vars, vals, &varsize, nvars, &constant, &requiredsize, TRUE) ); - assert( requiredsize <= nvars ); + SCIP_CALL( SCIPgetProbvarLinearSum(scip, vars, vals, &nvars, varssize, &constant, &requiredsize, TRUE) ); + assert( requiredsize <= varssize ); assert( numvisitednodes > 0 ); parentnode = visitednodes[numvisitednodes-1]; assert( parentnode < nnodes ); /* create nodes for all aggregation variables and coefficients and connect them to the parent node */ - for (k = 0; k < requiredsize; ++k) + for (k = 0; k < nvars; ++k) { SYM_CONSTTYPE* ct; int internode; @@ -1417,8 +1419,8 @@ SCIP_RETCODE fillGraphByConss( assert( m == nlinearedges + nnonlinearedges ); /* free everything */ - SCIPfreeBlockMemoryArrayNull(scip, &vals, nvars); - SCIPfreeBlockMemoryArrayNull(scip, &vars, nvars); + SCIPfreeBlockMemoryArrayNull(scip, &vals, varssize); + SCIPfreeBlockMemoryArrayNull(scip, &vars, varssize); SCIPfreeBlockMemoryArray(scip, &visitednodes, maxvisitednodes); SCIPfreeBlockMemoryArray(scip, &ischildofsum, maxischildofsum); From 49bfad47a5f02616521638e772bbbea0cb089f2c Mon Sep 17 00:00:00 2001 From: Christopher Hojny Date: Sun, 11 Jun 2023 16:35:56 +0200 Subject: [PATCH 2/7] updated sassy (bugfix) (cherry picked from commit d70a74a1511a59e9db65432ceaa6ceeb1c62c632) --- src/sassy/preprocessor.h | 35 +++++++++++++++++++---------------- 1 file changed, 19 insertions(+), 16 deletions(-) diff --git a/src/sassy/preprocessor.h b/src/sassy/preprocessor.h index 61905a4868..04b1c2d3d2 100644 --- a/src/sassy/preprocessor.h +++ b/src/sassy/preprocessor.h @@ -12,15 +12,10 @@ #include #include #include -#include "tinycthread/tinycthread.h" namespace sassy { class preprocessor; -#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201102L thread_local preprocessor* save_preprocessor; -#else - _Thread_local preprocessor* save_preprocessor; -#endif enum preop { deg01, deg2ue, deg2ma, qcedgeflip, probeqc, probe2qc, probeflat, redloop @@ -904,7 +899,7 @@ namespace sassy { mark_set path_done(g->v_size); work_list color_pos(g->v_size); - work_list filter(g->v_size); + //work_list filter(g->v_size); work_list not_unique(2*g->v_size); work_list not_unique_analysis(g->v_size); work_list path_list(g->v_size); @@ -986,15 +981,15 @@ namespace sassy { color_test.set(neighbour_col); } - filter.reset(); + //filter.reset(); not_unique.reset(); // filter to indices with unique colors for (int j = 0; j < endpoints; ++j) { const int neighbour = connected_paths[g->v[test_vertex] + j]; const int neighbour_col = col.vertex_to_col[neighbour]; if (!color_unique.get(neighbour_col)) { // if unique - filter.push_back(j); // add index to filter - } else { + //filter.push_back(j); // add index to filter + } else { // if not unique not_unique.push_back(neighbour); assert(connected_endpoints[g->v[test_vertex] + j] >= 0); assert(connected_endpoints[g->v[test_vertex] + j] < g->v_size); @@ -1009,23 +1004,29 @@ namespace sassy { for (int kk = 0; kk < not_unique.cur_pos; kk += 2) { const int endpoint = not_unique[kk + 1]; const int endpoint_col = col.vertex_to_col[endpoint]; - not_unique_analysis[endpoint_col] = 0; + const int neighbour = not_unique[kk]; + const int neighbour_col = col.vertex_to_col[neighbour]; + not_unique_analysis[endpoint_col] = 0; + not_unique_analysis[neighbour_col] = 0; } for (int kk = 0; kk < not_unique.cur_pos; kk += 2) { const int endpoint = not_unique[kk + 1]; const int endpoint_col = col.vertex_to_col[endpoint]; + const int neighbour = not_unique[kk]; + const int neighbour_col = col.vertex_to_col[neighbour]; ++not_unique_analysis[endpoint_col]; + ++not_unique_analysis[neighbour_col]; } for (int kk = 0; kk < not_unique.cur_pos; kk += 2) { const int neighbour = not_unique[kk]; + const int neighbour_col = col.vertex_to_col[neighbour]; const int endpoint = not_unique[kk + 1]; const int endpoint_col = col.vertex_to_col[endpoint]; const int endpoint_col_sz = col.ptn[endpoint_col] + 1; path.reset(); if (!color_test.get(endpoint_col)) { color_test.set(endpoint_col); - - if (not_unique_analysis[endpoint_col] == col.ptn[endpoint_col] + 1) { + if (not_unique_analysis[endpoint_col] == not_unique_analysis[neighbour_col] && not_unique_analysis[endpoint_col] == col.ptn[endpoint_col] + 1) { // check that path endpoints dont contain duplicates bool all_unique = true; color_unique.reset(); @@ -1041,12 +1042,12 @@ namespace sassy { } } - if (all_unique && col.ptn[endpoint_col] + 1 == not_unique_analysis[endpoint_col] && color < endpoint_col) { // col.ptn[endpoint_col] + 1 == 2 && color_size == 2 && only_once - // TODO: make sure it's not doubly-connected to one of the vertices (need to check this for every vertex, actually)? + // test_vertex connects to all vertices of endpoint_col! + if (all_unique && color < endpoint_col) { // col.ptn[endpoint_col] + 1 == 2 && color_size == 2 && only_once const int path_col = col.vertex_to_col[neighbour]; const int path_col_sz = col.ptn[path_col] + 1; - - assert(path_col_sz == (not_unique_analysis[endpoint_col] * color_size)); + const int connects_to = not_unique_analysis[endpoint_col]; + assert(path_col_sz == (connects_to * color_size)); assert(endpoint_col_sz == not_unique_analysis[endpoint_col]); @@ -4646,6 +4647,8 @@ namespace sassy { PRINT("____________________________________________________"); PRINT(std::setw(16) << std::left << (std::chrono::duration_cast(std::chrono::high_resolution_clock::now() - std::chrono::high_resolution_clock::now()).count()) / 1000000.0 << std::setw(16) << "start" << std::setw(10) << g->v_size << std::setw(10) << g->e_size ); + std::chrono::high_resolution_clock::time_point timer = std::chrono::high_resolution_clock::now(); + if(config->CONFIG_TRANSLATE_ONLY) { translate_layer_fwd.reserve(g->v_size); backward_translation_layers.emplace_back(std::vector()); From 21b036b243d77bdc808ebc30014aaf16ba9e7e3c Mon Sep 17 00:00:00 2001 From: Christopher Hojny Date: Tue, 13 Jun 2023 20:08:36 +0200 Subject: [PATCH 3/7] use print function (cherry picked from commit f94b47c0ad926958699776815d76e0c160fa18bd) --- src/sassy/utility.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/sassy/utility.h b/src/sassy/utility.h index 4894d529b4..08651d1985 100644 --- a/src/sassy/utility.h +++ b/src/sassy/utility.h @@ -27,8 +27,8 @@ namespace sassy { #define MASH4(i) (((unsigned long) i + 1) * (23524361 - (unsigned long) i * 3)) #define MASH5(i) (((unsigned long) i + 1) * (23524361 - (unsigned long) i * 3)) -//#define PRINT(str) {if(config->CONFIG_PRINT) {std::cout << str << std::endl;}} -#define PRINT(str) {} +#define PRINT(str) {if(config->CONFIG_PRINT) {std::cout << str << std::endl;}} +// #define PRINT(str) {} // metrics used to compare strategies struct strategy_metrics { From bf3489c911a4f44fce4dd70f0d1421ee9b445b0a Mon Sep 17 00:00:00 2001 From: Christopher Hojny Date: Tue, 13 Jun 2023 20:08:48 +0200 Subject: [PATCH 4/7] distinguish pragmas by compiler (cherry picked from commit 30e210191000ea7d5d41a983d11fefc6754c0f0a) --- src/symmetry/compute_symmetry_sassy.cpp | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/src/symmetry/compute_symmetry_sassy.cpp b/src/symmetry/compute_symmetry_sassy.cpp index c1d7640c2d..e27ea73fa3 100644 --- a/src/symmetry/compute_symmetry_sassy.cpp +++ b/src/symmetry/compute_symmetry_sassy.cpp @@ -36,15 +36,34 @@ #include /* include sassy */ +#ifdef __GNUC__ #pragma GCC diagnostic ignored "-Wshadow" #pragma GCC diagnostic ignored "-Wunused-variable" #pragma GCC diagnostic ignored "-Wsign-compare" #pragma GCC diagnostic ignored "-Wunused-but-set-variable" +#endif + +#ifdef _MSC_VER +# pragma warning(push) +# pragma warning(disable: 4189) // local variable is initialized but not referenced +# pragma warning(disable: 4388) // compare signed and unsigned expression +# pragma warning(disable: 4456) // shadowed variable +#endif + +/* the actual include */ #include + +#ifdef __GNUC__ #pragma GCC diagnostic warning "-Wunused-but-set-variable" #pragma GCC diagnostic warning "-Wsign-compare" #pragma GCC diagnostic warning "-Wunused-variable" #pragma GCC diagnostic warning "-Wshadow" +#endif + +#ifdef _MSC_VER +# pragma warning(pop) +#endif + #include #include "scip/expr_var.h" From c8059f8bcd61110d421ba17899b51f9f8419b4ca Mon Sep 17 00:00:00 2001 From: Christopher Hojny Date: Tue, 13 Jun 2023 20:31:45 +0200 Subject: [PATCH 5/7] added another pragma (cherry picked from commit 3e376c757aaa1032a404cee8b50615b15105fb5b) --- src/symmetry/compute_symmetry_sassy.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/symmetry/compute_symmetry_sassy.cpp b/src/symmetry/compute_symmetry_sassy.cpp index e27ea73fa3..066709cf66 100644 --- a/src/symmetry/compute_symmetry_sassy.cpp +++ b/src/symmetry/compute_symmetry_sassy.cpp @@ -48,6 +48,7 @@ # pragma warning(disable: 4189) // local variable is initialized but not referenced # pragma warning(disable: 4388) // compare signed and unsigned expression # pragma warning(disable: 4456) // shadowed variable +# pragma warning(disable: 4430) // missing type specifier #endif /* the actual include */ From 6bd975db74d6f492b9e47d48084db9fef15086c4 Mon Sep 17 00:00:00 2001 From: Stefan Vigerske Date: Mon, 17 Jul 2023 14:13:38 +0200 Subject: [PATCH 6/7] bring back thread_local compatibilty for (old?) windows compilers (cherry picked from commit ad6ee9b573439c59288f982a56e8eb362cc4f5f6) --- src/sassy/preprocessor.h | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/sassy/preprocessor.h b/src/sassy/preprocessor.h index 04b1c2d3d2..6c1f84c4b8 100644 --- a/src/sassy/preprocessor.h +++ b/src/sassy/preprocessor.h @@ -12,10 +12,15 @@ #include #include #include +#include "tinycthread/tinycthread.h" namespace sassy { class preprocessor; +#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201102L thread_local preprocessor* save_preprocessor; +#else + _Thread_local preprocessor* save_preprocessor; +#endif enum preop { deg01, deg2ue, deg2ma, qcedgeflip, probeqc, probe2qc, probeflat, redloop From 6e61c60f55868cbab7bf1a9f4f1d979eee91fdd0 Mon Sep 17 00:00:00 2001 From: Stefan Vigerske Date: Thu, 20 Jul 2023 19:29:38 +0200 Subject: [PATCH 7/7] Revert "use print function", disable timer instead This reverts commit f94b47c0ad926958699776815d76e0c160fa18bd and disable the initialization of timer. (cherry picked from commit 1cd45014e1da26603d57eaa19757553f9a765971) --- src/sassy/preprocessor.h | 3 ++- src/sassy/utility.h | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/sassy/preprocessor.h b/src/sassy/preprocessor.h index 6c1f84c4b8..86ab28bbad 100644 --- a/src/sassy/preprocessor.h +++ b/src/sassy/preprocessor.h @@ -4652,7 +4652,8 @@ namespace sassy { PRINT("____________________________________________________"); PRINT(std::setw(16) << std::left << (std::chrono::duration_cast(std::chrono::high_resolution_clock::now() - std::chrono::high_resolution_clock::now()).count()) / 1000000.0 << std::setw(16) << "start" << std::setw(10) << g->v_size << std::setw(10) << g->e_size ); - std::chrono::high_resolution_clock::time_point timer = std::chrono::high_resolution_clock::now(); + //SV took this out, as it is only used if the PRINT macro is enabled (and CONFIG_PRINT is enabled) + //SV std::chrono::high_resolution_clock::time_point timer = std::chrono::high_resolution_clock::now(); if(config->CONFIG_TRANSLATE_ONLY) { translate_layer_fwd.reserve(g->v_size); diff --git a/src/sassy/utility.h b/src/sassy/utility.h index 08651d1985..4894d529b4 100644 --- a/src/sassy/utility.h +++ b/src/sassy/utility.h @@ -27,8 +27,8 @@ namespace sassy { #define MASH4(i) (((unsigned long) i + 1) * (23524361 - (unsigned long) i * 3)) #define MASH5(i) (((unsigned long) i + 1) * (23524361 - (unsigned long) i * 3)) -#define PRINT(str) {if(config->CONFIG_PRINT) {std::cout << str << std::endl;}} -// #define PRINT(str) {} +//#define PRINT(str) {if(config->CONFIG_PRINT) {std::cout << str << std::endl;}} +#define PRINT(str) {} // metrics used to compare strategies struct strategy_metrics {