text: /*
   * Copyright (c) 2019-2021, NVIDIA CORPORATION.  All rights reserved.
   *
   * NVIDIA CORPORATION and its licensors retain all intellectual property
   * and proprietary rights in and to this software, related documentation
   * and any modifications thereto.  Any use, reproduction, disclosure or
   * distribution of this software and related documentation without an express
   * license agreement from NVIDIA CORPORATION is strictly prohibited.
   *
   */
  #include <utilities/base_fixture.hpp>
  
  #include <cugraph/algorithms.hpp>
  
  #include <rmm/thrust_rmm_allocator.h>
  
  TEST(balanced_edge, success)
  {
    std::vector<int> off_h = {0,  16,  25,  35,  41,  44,  48,  52,  56,  61,  63, 66,
                              67, 69,  74,  76,  78,  80,  82,  84,  87,  89,  91, 93,
                              98, 101, 104, 106, 110, 113, 117, 121, 127, 139, 156};
    std::vector<int> ind_h = {
      1,  2,  3,  4,  5,  6,  7,  8,  10, 11, 12, 13, 17, 19, 21, 31, 0,  2,  3,  7,  13, 17, 19,
      21, 30, 0,  1,  3,  7,  8,  9,  13, 27, 28, 32, 0,  1,  2,  7,  12, 13, 0,  6,  10, 0,  6,
      10, 16, 0,  4,  5,  16, 0,  1,  2,  3,  0,  2,  30, 32, 33, 2,  33, 0,  4,  5,  0,  0,  3,
      0,  1,  2,  3,  33, 32, 33, 32, 33, 5,  6,  0,  1,  32, 33, 0,  1,  33, 32, 33, 0,  1,  32,
      33, 25, 27, 29, 32, 33, 25, 27, 31, 23, 24, 31, 29, 33, 2,  23, 24, 33, 2,  31, 33, 23, 26,
      32, 33, 1,  8,  32, 33, 0,  24, 25, 28, 32, 33, 2,  8,  14, 15, 18, 20, 22, 23, 29, 30, 31,
      33, 8,  9,  13, 14, 15, 18, 19, 20, 22, 23, 26, 27, 28, 29, 30, 31, 32};
    std::vector<float> w_h = {
      1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0,
      1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0,
      1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0,
      1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0,
      1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0,
      1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0,
      1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0,
      1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0,
      1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0};
  
    int num_verts = off_h.size() - 1;
    int num_edges = ind_h.size();
  
    std::vector<int> cluster_id(num_verts, -1);
  
    rmm::device_vector<int> offsets_v(off_h);
    rmm::device_vector<int> indices_v(ind_h);
    rmm::device_vector<float> weights_v(w_h);
    rmm::device_vector<int> result_v(cluster_id);
  
    cugraph::legacy::GraphCSRView<int, int, float> G(
      offsets_v.data().get(), indices_v.data().get(), weights_v.data().get(), num_verts, num_edges);
  
    int num_clusters{8};
    int num_eigenvectors{8};
    float evs_tolerance{.00001};
    float kmean_tolerance{.00001};
    int evs_max_iter{100};
    int kmean_max_iter{100};
    float score;
  
    cugraph::ext_raft::balancedCutClustering(G,
                                             num_clusters,
                                             num_eigenvectors,
                                             evs_tolerance,
                                             evs_max_iter,
                                             kmean_tolerance,
                                             kmean_max_iter,
                                             result_v.data().get());
    cugraph::ext_raft::analyzeClustering_edge_cut(G, num_clusters, result_v.data().get(), &score);
  
    std::cout << "score = " << score << std::endl;
    ASSERT_LT(score, float{55.0});
  }
  
  CUGRAPH_TEST_PROGRAM_MAIN()
  