 
             // TODO: switch R_TYPE for different reduce operators
             // Do segreduction using d_scanned_edges and d_reduce_frontier
-            SegReduceCsr(d_reduce_frontier, partitioned_scanned_edges, output_queue_len,frontier_attribute.queue_length,
-            false, d_reduced_value, (int)0, mgpu::plus<typename KernelPolicy::Value>(), context);
-
-            // save the result to d_reduced_value
-            //
+            if (R_TYPE != gunrock::oprtr::advance::EMPTY && d_value_to_reduce && d_reduce_frontier) {
+              switch (REDUCE_OP) {
+                case: gunrock::oprtr::advance::PLUS {
+                    SegReduceCsr(d_reduce_frontier, partitioned_scanned_edges, output_queue_len,frontier_attribute.queue_length,
+                      false, d_reduced_value, (int)0, mgpu::plus<typename KernelPolicy::Value>(), context);
+                      break;
+                }
+                case: gunrock::oprtr::advance::MULTIPLIES {
+                    SegReduceCsr(d_reduce_frontier, partitioned_scanned_edges, output_queue_len,frontier_attribute.queue_length,
+                      false, d_reduced_value, (int)0, mgpu::multiplies<typename KernelPolicy::Value>(), context);
+                      break;
+                }
+                case: gunrock::oprtr::advance::MAXIMUM {
+                    SegReduceCsr(d_reduce_frontier, partitioned_scanned_edges, output_queue_len,frontier_attribute.queue_length,
+                      false, d_reduced_value, (int)0, mgpu::maximum<typename KernelPolicy::Value>(), context);
+                      break;
+                }
+                case: gunrock::oprtr::advance::MINIMUM {
+                    SegReduceCsr(d_reduce_frontier, partitioned_scanned_edges, output_queue_len,frontier_attribute.queue_length,
+                      false, d_reduced_value, (int)0, mgpu::minimum<typename KernelPolicy::Value>(), context);
+                      break;
+                }
+                case: gunrock::oprtr::advance::BIT_OR {
+                    SegReduceCsr(d_reduce_frontier, partitioned_scanned_edges, output_queue_len,frontier_attribute.queue_length,
+                      false, d_reduced_value, (int)0, mgpu::bit_or<typename KernelPolicy::Value>(), context);
+                      break;
+                }
+                case: gunrock::oprtr::advance::BIT_AND {
+                    SegReduceCsr(d_reduce_frontier, partitioned_scanned_edges, output_queue_len,frontier_attribute.queue_length,
+                      false, d_reduced_value, (int)0, mgpu::bit_and<typename KernelPolicy::Value>(), context);
+                      break;
+                }
+                case: gunrock::oprtr::advance::BIT_XOR {
+                    SegReduceCsr(d_reduce_frontier, partitioned_scanned_edges, output_queue_len,frontier_attribute.queue_length,
+                      false, d_reduced_value, (int)0, mgpu::bit_xor<typename KernelPolicy::Value>(), context);
+                      break;
+                }
+                default:
+                    //default operator is plus
+                    SegReduceCsr(d_reduce_frontier, partitioned_scanned_edges, output_queue_len,frontier_attribute.queue_length,
+                      false, d_reduced_value, (int)0, mgpu::plus<typename KernelPolicy::Value>(), context);
+                      break;
+              }
+            }
             break;
         }
         /*case LB:

 * @param[in] d_out_key_queue           Device pointer of output key array to the outgoing frontier queue
 * @param[in] d_in_value_queue          Device pointer of input value array to the incoming frontier queue
 * @param[in] d_out_value_queue         Device pointer of output value array to the outgoing frontier queue
 * @param[in] d_row_offsets             Device pointer of SizeT to the row offsets queue  
 * @param[in] d_column_indices          Device pointer of VertexId to the column indices queue
 * @param[in] d_column_offsets          Device pointer of SizeT to the row offsets queue for inverse graph
 * @param[in] d_row_indices             Device pointer of VertexId to the column indices queue for inverse graph

#include <gunrock/util/operators.cuh>

#include <gunrock/util/test_utils.cuh>
#include <gunrock/app/problem_base.cuh>
#include <gunrock/app/enactor_base.cuh>

