]> granicus.if.org Git - graphviz/commitdiff
nearest_neighbor_graph: remove manual memory management
authorMatthew Fernandez <matthew.fernandez@gmail.com>
Sat, 8 Jan 2022 18:57:35 +0000 (10:57 -0800)
committerMatthew Fernandez <matthew.fernandez@gmail.com>
Tue, 11 Jan 2022 15:52:08 +0000 (07:52 -0800)
Gitlab: #2154

lib/mingle/nearest_neighbor_graph.cpp

index d1b9df67ec20fe8ef21e00b234d8a367f08e5775..17690cfa734efa3eedf103bc67da5c65ab6c48ca 100644 (file)
@@ -14,6 +14,7 @@
 #include <sparse/SparseMatrix.h>
 #include <mingle/nearest_neighbor_graph_ann.h>
 #include <mingle/nearest_neighbor_graph.h>
+#include <vector>
 
 SparseMatrix nearest_neighbor_graph(int nPts, int num_neigbors, double *x, double eps){
   /* Gives a nearest neighbor graph of a list of dim-dimendional points. The result is a sparse matrix
@@ -26,27 +27,25 @@ SparseMatrix nearest_neighbor_graph(int nPts, int num_neigbors, double *x, doubl
     x: nPts*dim vector. The i-th point is x[i*dim : i*dim + dim - 1]
 
   */
-  int *irn = NULL, *jcn = NULL, nz;
-  double *val = NULL;
+  int nz;
   SparseMatrix A;
   int k = num_neigbors;
 
+#ifdef HAVE_ANN
   /* need to *2 as we do two sweeps of neighbors, so could have repeats */
-  irn =  (int*)MALLOC(sizeof(int)*nPts*k*2);
-  jcn =  (int*)MALLOC(sizeof(int)*nPts*k*2);
-  val =  (double*)MALLOC(sizeof(double)*nPts*k*2);
+  std::vector<int> irn(nPts * k * 2);
+  std::vector<int> jcn(nPts * k * 2);
+  std::vector<double> val(nPts * k * 2);
 
-#ifdef HAVE_ANN
-  nearest_neighbor_graph_ann(nPts, num_neigbors, eps, x, &nz, irn, jcn, val);
+  nearest_neighbor_graph_ann(nPts, num_neigbors, eps, x, &nz, irn.data(),
+                             jcn.data(), val.data());
 
-  A = SparseMatrix_from_coordinate_arrays(nz, nPts, nPts, irn, jcn, val, MATRIX_TYPE_REAL, sizeof(double));
+  A = SparseMatrix_from_coordinate_arrays(nz, nPts, nPts, irn.data(),
+                                          jcn.data(), val.data(),
+                                          MATRIX_TYPE_REAL, sizeof(double));
 #else
   A = NULL;
 #endif
 
-  free(irn);
-  free(jcn);
-  free(val);
-
   return A;
 }