@@ -26,7 +26,7 @@ namespace osp {
2626
2727namespace SarkarParams {
2828
29- enum class BufferMergeMode { OFF, FAN_IN, FAN_OUT, HOMOGENEOUS, MIX };
29+ enum class BufferMergeMode { OFF, FAN_IN, FAN_OUT, HOMOGENEOUS, FULL };
3030
3131template <typename commCostType>
3232struct MulParameters {
@@ -239,55 +239,35 @@ RETURN_STATUS SarkarMul<Graph_t, Graph_t_coarse>::run_buffer_merges() {
239239 RETURN_STATUS status = RETURN_STATUS::OSP_SUCCESS;
240240
241241 unsigned no_change = 0 ;
242- while (no_change < ml_params.max_num_iteration_without_changes ) {
243- switch (ml_params.buffer_merge_mode )
244- {
245- case SarkarParams::BufferMergeMode::FAN_IN:
246- {
247- params.mode = SarkarParams::Mode::FAN_IN_BUFFER;
248- }
249- break ;
250-
251- case SarkarParams::BufferMergeMode::FAN_OUT:
252- {
253- params.mode = SarkarParams::Mode::FAN_OUT_BUFFER;
254- }
255- break ;
256-
257- case SarkarParams::BufferMergeMode::HOMOGENEOUS:
258- {
259- params.mode = SarkarParams::Mode::HOMOGENEOUS_BUFFER;
260- }
261- break ;
262-
263- case SarkarParams::BufferMergeMode::MIX:
264- {
265- if (thue_coin.get_flip ()) {
266- params.mode = SarkarParams::Mode::HOMOGENEOUS_BUFFER;
267- } else {
268- params.mode = thue_coin.get_flip () ? SarkarParams::Mode::FAN_IN_BUFFER : SarkarParams::Mode::FAN_OUT_BUFFER;
269- }
270- }
271- break ;
272-
273- default :
274- {
275- params.mode = SarkarParams::Mode::HOMOGENEOUS_BUFFER;
276- }
277- break ;
278- }
279- updateParams ();
280-
242+ while (no_change < ml_params.max_num_iteration_without_changes ) {
281243 vertex_idx_t <Graph_t> diff = 0 ;
282- status = std::max (status, run_single_contraction_mode (diff));
244+ if ((ml_params.buffer_merge_mode == SarkarParams::BufferMergeMode::HOMOGENEOUS) || (ml_params.buffer_merge_mode == SarkarParams::BufferMergeMode::FULL && diff == 0 )) {
245+ params.mode = SarkarParams::Mode::HOMOGENEOUS_BUFFER;
246+ updateParams ();
247+ status = std::max (status, run_single_contraction_mode (diff));
248+ }
249+ if (ml_params.buffer_merge_mode == SarkarParams::BufferMergeMode::FAN_IN) {
250+ params.mode = SarkarParams::Mode::FAN_IN_BUFFER;
251+ updateParams ();
252+ status = std::max (status, run_single_contraction_mode (diff));
253+ }
254+ if (ml_params.buffer_merge_mode == SarkarParams::BufferMergeMode::FAN_OUT) {
255+ params.mode = SarkarParams::Mode::FAN_OUT_BUFFER;
256+ updateParams ();
257+ status = std::max (status, run_single_contraction_mode (diff));
258+ }
259+ if (ml_params.buffer_merge_mode == SarkarParams::BufferMergeMode::FULL && diff == 0 ) {
260+ params.mode = thue_coin.get_flip () ? SarkarParams::Mode::FAN_IN_BUFFER : SarkarParams::Mode::FAN_OUT_BUFFER;
261+ updateParams ();
262+ status = std::max (status, run_single_contraction_mode (diff));
263+ }
283264
284265 if (diff > 0 ) {
285266 no_change = 0 ;
267+ status = std::max (status, run_contractions ( ml_params.commCostVec .back () ));
286268 } else {
287269 no_change++;
288270 }
289-
290- status = std::max (status, run_contractions ( ml_params.commCostVec .back () ));
291271 }
292272
293273 return status;
0 commit comments