- Timestamp:
- 09/08/16 11:41:45 (8 years ago)
- Location:
- branches/symbreg-factors-2650/HeuristicLab.ExtLibs/HeuristicLab.Igraph/0.8.0-pre/HeuristicLab.Igraph-0.8.0-pre
- Files:
-
- 2 added
- 1 deleted
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/symbreg-factors-2650/HeuristicLab.ExtLibs/HeuristicLab.Igraph/0.8.0-pre/HeuristicLab.Igraph-0.8.0-pre/Datatypes.cs
r14276 r14277 49 49 [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)] 50 50 internal class igraph_matrix_t { 51 i graph_vector_t data = new igraph_vector_t();51 internal igraph_vector_t data = new igraph_vector_t(); 52 52 internal int nrow; 53 53 internal int ncol; … … 128 128 #endregion 129 129 130 #region Delegates 131 [UnmanagedFunctionPointer(CallingConvention.Cdecl, CharSet = CharSet.Ansi)] 132 internal delegate bool igraph_bfshandler_t(igraph_t graph, int vid, int pred, int succ, int rank, int dist, IntPtr extra); 133 134 [UnmanagedFunctionPointer(CallingConvention.Cdecl, CharSet = CharSet.Ansi)] 135 internal delegate bool igraph_dfshandler_t(igraph_t graph, int vid, int dist, IntPtr extra); 136 #endregion 137 130 138 #region Enums 131 139 internal enum igraph_layout_grid_t { -
branches/symbreg-factors-2650/HeuristicLab.ExtLibs/HeuristicLab.Igraph/0.8.0-pre/HeuristicLab.Igraph-0.8.0-pre/DllImporter.cs
r14276 r14277 87 87 arpackoptions.nev = 1; 88 88 arpackoptions.ishift = 1; 89 arpackoptions.mxiter = 3000;89 arpackoptions.mxiter = 1000; 90 90 arpackoptions.nb = 1; 91 91 arpackoptions.mode = 1; … … 109 109 internal static int igraph_add_edge(igraph_t graph, int from, int to) { 110 110 return X86 ? igraph_add_edge_x86(graph, from, to) : igraph_add_edge_x64(graph, from, to); 111 } 112 #endregion 113 114 #region igraph visits 115 internal static int igraph_bfs(igraph_t graph, int root, igraph_vector_t roots, igraph_neimode_t mode, bool unreachable, igraph_vector_t restricted, igraph_vector_t order, igraph_vector_t rank, igraph_vector_t father, igraph_vector_t pred, igraph_vector_t succ, igraph_vector_t dist, igraph_bfshandler_t callback, object tag) { 116 return MarshalIfExistsAndCall(tag, ptr => X86 ? igraph_bfs_x86(graph, root, roots, mode, unreachable, restricted, order, rank, father, pred, succ, dist, callback, ptr) : igraph_bfs_x64(graph, root, roots, mode, unreachable, restricted, order, rank, father, pred, succ, dist, callback, ptr)); 117 } 118 internal static int igraph_dfs(igraph_t graph, int root, igraph_neimode_t mode, bool unreachable, igraph_vector_t order, igraph_vector_t order_out, igraph_vector_t father, igraph_vector_t dist, igraph_dfshandler_t inWrapper, igraph_dfshandler_t outWrapper, object tag) { 119 return MarshalIfExistsAndCall(tag, ptr => X86 ? igraph_dfs_x86(graph, root, mode, unreachable, order, order_out, father, dist, inWrapper, outWrapper, ptr) : igraph_dfs_x64(graph, root, mode, unreachable, order, order_out, father, dist, inWrapper, outWrapper, ptr)); 111 120 } 112 121 #endregion … … 137 146 [DllImport(X64Dll, EntryPoint = "igraph_pagerank", CallingConvention = CallingConvention.Cdecl)] 138 147 private static extern int igraph_pagerank_x64(igraph_t graph, igraph_pagerank_algo_t algo, [In, Out]igraph_vector_t vector, ref double value, igraph_vs_t vids, bool directed, double damping, igraph_vector_t weights, IntPtr options); 148 [DllImport(X86Dll, EntryPoint = "igraph_bfs", CallingConvention = CallingConvention.Cdecl)] 149 private static extern int igraph_bfs_x86(igraph_t graph, int root, igraph_vector_t roots, igraph_neimode_t mode, bool unreachable, igraph_vector_t restricted, [In, Out]igraph_vector_t order, [In, Out]igraph_vector_t rank, [In, Out]igraph_vector_t father, [In, Out]igraph_vector_t pred, [In, Out]igraph_vector_t succ, [In, Out]igraph_vector_t dist, igraph_bfshandler_t callback, IntPtr extra); 150 [DllImport(X64Dll, EntryPoint = "igraph_bfs", CallingConvention = CallingConvention.Cdecl)] 151 private static extern int igraph_bfs_x64(igraph_t graph, int root, igraph_vector_t roots, igraph_neimode_t mode, bool unreachable, igraph_vector_t restricted, [In, Out]igraph_vector_t order, [In, Out]igraph_vector_t rank, [In, Out]igraph_vector_t father, [In, Out]igraph_vector_t pred, [In, Out]igraph_vector_t succ, [In, Out]igraph_vector_t dist, igraph_bfshandler_t callback, IntPtr extra); 152 [DllImport(X86Dll, EntryPoint = "igraph_dfs", CallingConvention = CallingConvention.Cdecl)] 153 private static extern int igraph_dfs_x86(igraph_t graph, int root, igraph_neimode_t mode, bool unreachable, [In, Out]igraph_vector_t order, [In, Out]igraph_vector_t order_out, [In, Out]igraph_vector_t father, [In, Out]igraph_vector_t dist, igraph_dfshandler_t in_callback, igraph_dfshandler_t out_callback, IntPtr extra); 154 [DllImport(X64Dll, EntryPoint = "igraph_dfs", CallingConvention = CallingConvention.Cdecl)] 155 private static extern int igraph_dfs_x64(igraph_t graph, int root, igraph_neimode_t mode, bool unreachable, [In, Out]igraph_vector_t order, [In, Out]igraph_vector_t order_out, [In, Out]igraph_vector_t father, [In, Out]igraph_vector_t dist, igraph_dfshandler_t in_callback, igraph_dfshandler_t out_callback, IntPtr extra); 139 156 #endregion 140 157 #endregion … … 168 185 return X86 ? igraph_vector_init_x86(vector, length) : igraph_vector_init_x64(vector, length); 169 186 } 187 internal static int igraph_vector_init_copy(igraph_vector_t vector, double[] vec) { 188 return X86 ? igraph_vector_init_copy_x86(vector, vec, vec.Length) : igraph_vector_init_copy_x64(vector, vec, vec.Length); 189 } 170 190 internal static void igraph_vector_destroy(igraph_vector_t vector) { 171 191 if (X86) igraph_vector_destroy_x86(vector); … … 175 195 return X86 ? igraph_vector_copy_x86(to, from) : igraph_vector_copy_x64(to, from); 176 196 } 197 internal static double[] igraph_vector_to_array(igraph_vector_t from) { 198 var len = igraph_vector_size(from); 199 var result = new double[len]; 200 if (X86) igraph_vector_copy_to_x86(from, result); 201 else igraph_vector_copy_to_x64(from, result); 202 return result; 203 } 177 204 178 205 internal static int igraph_vector_size(igraph_vector_t vector) { … … 187 214 if (X86) igraph_vector_set_x86(vector, index, value); 188 215 else igraph_vector_set_x64(vector, index, value); 216 } 217 internal static void igraph_vector_fill(igraph_vector_t vector, double v) { 218 if (X86) igraph_vector_fill_x86(vector, v); 219 else igraph_vector_fill_x64(vector, v); 220 } 221 internal static void igraph_vector_scale(igraph_vector_t vector, double by) { 222 if (X86) igraph_vector_scale_x86(vector, by); 223 else igraph_vector_scale_x64(vector, by); 224 } 225 226 internal static int igraph_vector_reverse(igraph_vector_t vector) { 227 return X86 ? igraph_vector_reverse_x86(vector) : igraph_vector_reverse_x64(vector); 228 } 229 internal static int igraph_vector_shuffle(igraph_vector_t vector) { 230 return X86 ? igraph_vector_shuffle_x86(vector) : igraph_vector_shuffle_x64(vector); 189 231 } 190 232 … … 194 236 [DllImport(X64Dll, EntryPoint = "igraph_vector_init", CallingConvention = CallingConvention.Cdecl)] 195 237 private static extern int igraph_vector_init_x64([In, Out]igraph_vector_t vector, int length); 238 [DllImport(X86Dll, EntryPoint = "igraph_vector_init_copy", CallingConvention = CallingConvention.Cdecl)] 239 private static extern int igraph_vector_init_copy_x86([In, Out]igraph_vector_t vector, double[] vec, int length); 240 [DllImport(X64Dll, EntryPoint = "igraph_vector_init_copy", CallingConvention = CallingConvention.Cdecl)] 241 private static extern int igraph_vector_init_copy_x64([In, Out]igraph_vector_t vector, double[] vec, int length); 196 242 [DllImport(X86Dll, EntryPoint = "igraph_vector_destroy", CallingConvention = CallingConvention.Cdecl)] 197 243 private static extern void igraph_vector_destroy_x86([In, Out]igraph_vector_t vector); … … 214 260 [DllImport(X64Dll, EntryPoint = "igraph_vector_copy", CallingConvention = CallingConvention.Cdecl)] 215 261 private static extern int igraph_vector_copy_x64([In, Out]igraph_vector_t to, igraph_vector_t from); 262 [DllImport(X86Dll, EntryPoint = "igraph_vector_copy_to", CallingConvention = CallingConvention.Cdecl)] 263 private static extern void igraph_vector_copy_to_x86(igraph_vector_t from, [In, Out]double[] to); 264 [DllImport(X64Dll, EntryPoint = "igraph_vector_copy_to", CallingConvention = CallingConvention.Cdecl)] 265 private static extern void igraph_vector_copy_to_x64(igraph_vector_t from, [In, Out]double[] to); 266 [DllImport(X86Dll, EntryPoint = "igraph_vector_fill", CallingConvention = CallingConvention.Cdecl)] 267 private static extern int igraph_vector_fill_x86([In, Out]igraph_vector_t vector, double v); 268 [DllImport(X64Dll, EntryPoint = "igraph_vector_fill", CallingConvention = CallingConvention.Cdecl)] 269 private static extern int igraph_vector_fill_x64([In, Out]igraph_vector_t vector, double v); 270 [DllImport(X86Dll, EntryPoint = "igraph_vector_reverse", CallingConvention = CallingConvention.Cdecl)] 271 private static extern int igraph_vector_reverse_x86([In, Out]igraph_vector_t vector); 272 [DllImport(X64Dll, EntryPoint = "igraph_vector_reverse", CallingConvention = CallingConvention.Cdecl)] 273 private static extern int igraph_vector_reverse_x64([In, Out]igraph_vector_t vector); 274 [DllImport(X86Dll, EntryPoint = "igraph_vector_shuffle", CallingConvention = CallingConvention.Cdecl)] 275 private static extern int igraph_vector_shuffle_x86([In, Out]igraph_vector_t vector); 276 [DllImport(X64Dll, EntryPoint = "igraph_vector_shuffle", CallingConvention = CallingConvention.Cdecl)] 277 private static extern int igraph_vector_shuffle_x64([In, Out]igraph_vector_t vector); 278 [DllImport(X86Dll, EntryPoint = "igraph_vector_scale", CallingConvention = CallingConvention.Cdecl)] 279 private static extern void igraph_vector_scale_x86([In, Out]igraph_vector_t vector, double by); 280 [DllImport(X64Dll, EntryPoint = "igraph_vector_scale", CallingConvention = CallingConvention.Cdecl)] 281 private static extern void igraph_vector_scale_x64([In, Out]igraph_vector_t vector, double by); 216 282 #endregion 217 283 #endregion … … 236 302 if (X86) igraph_matrix_set_x86(matrix, row, col, value); 237 303 else igraph_matrix_set_x64(matrix, row, col, value); 304 } 305 306 internal static void igraph_matrix_fill(igraph_matrix_t matrix, double v) { 307 if (X86) igraph_matrix_fill_x86(matrix, v); 308 else igraph_matrix_fill_x64(matrix, v); 309 } 310 311 internal static int igraph_matrix_transpose(igraph_matrix_t matrix) { 312 return X86 ? igraph_matrix_transpose_x86(matrix) : igraph_matrix_transpose_x64(matrix); 313 } 314 315 internal static void igraph_matrix_scale(igraph_matrix_t matrix, double by) { 316 if (X86) igraph_matrix_scale_x86(matrix, by); 317 else igraph_matrix_scale_x64(matrix, by); 238 318 } 239 319 … … 259 339 [DllImport(X64Dll, EntryPoint = "igraph_matrix_copy", CallingConvention = CallingConvention.Cdecl)] 260 340 private static extern int igraph_matrix_copy_x64([In, Out]igraph_matrix_t to, igraph_matrix_t from); 341 [DllImport(X86Dll, EntryPoint = "igraph_matrix_fill", CallingConvention = CallingConvention.Cdecl)] 342 private static extern void igraph_matrix_fill_x86([In, Out]igraph_matrix_t matrix, double v); 343 [DllImport(X64Dll, EntryPoint = "igraph_matrix_fill", CallingConvention = CallingConvention.Cdecl)] 344 private static extern void igraph_matrix_fill_x64([In, Out]igraph_matrix_t matrix, double v); 345 [DllImport(X86Dll, EntryPoint = "igraph_matrix_transpose", CallingConvention = CallingConvention.Cdecl)] 346 private static extern int igraph_matrix_transpose_x86([In, Out]igraph_matrix_t matrix); 347 [DllImport(X64Dll, EntryPoint = "igraph_matrix_transpose", CallingConvention = CallingConvention.Cdecl)] 348 private static extern int igraph_matrix_transpose_x64([In, Out]igraph_matrix_t matrix); 349 [DllImport(X86Dll, EntryPoint = "igraph_matrix_scale", CallingConvention = CallingConvention.Cdecl)] 350 private static extern int igraph_matrix_scale_x86([In, Out]igraph_matrix_t matrix, double by); 351 [DllImport(X64Dll, EntryPoint = "igraph_matrix_scale", CallingConvention = CallingConvention.Cdecl)] 352 private static extern int igraph_matrix_scale_x64([In, Out]igraph_matrix_t matrix, double by); 261 353 #endregion 262 354 #endregion … … 271 363 internal static int igraph_layout_davidson_harel(igraph_t graph, igraph_matrix_t res, bool use_seed, int maxiter, int fineiter, double cool_fact, double weight_node_dist, double weight_border, double weight_edge_lengths, double weight_edge_crossings, double weight_node_edge_dist) { 272 364 return X86 ? igraph_layout_davidson_harel_x86(graph, res, use_seed, maxiter, fineiter, cool_fact, weight_node_dist, weight_border, weight_edge_lengths, weight_edge_crossings, weight_node_edge_dist) : igraph_layout_davidson_harel_x64(graph, res, use_seed, maxiter, fineiter, cool_fact, weight_node_dist, weight_border, weight_edge_lengths, weight_edge_crossings, weight_node_edge_dist); 365 } 366 internal static int igraph_layout_mds(igraph_t graph, igraph_matrix_t res, igraph_matrix_t dist = null, int dim = 2) { 367 return MarshalIfExistsAndCall(GetDefaultArpackOptions(), ptr => X86 ? igraph_layout_mds_x86(graph, res, dist, dim, ptr) : igraph_layout_mds_x64(graph, res, dist, dim, ptr)); 273 368 } 274 369 … … 286 381 [DllImport(X64Dll, EntryPoint = "igraph_layout_davidson_harel", CallingConvention = CallingConvention.Cdecl)] 287 382 private static extern int igraph_layout_davidson_harel_x64(igraph_t graph, [In, Out]igraph_matrix_t res, bool use_seed, int maxiter, int fineiter, double cool_fact, double weight_node_dist, double weight_border, double weight_edge_lengths, double weight_edge_crossings, double weight_node_edge_dist); 383 [DllImport(X86Dll, EntryPoint = "igraph_layout_mds", CallingConvention = CallingConvention.Cdecl)] 384 private static extern int igraph_layout_mds_x86(igraph_t graph, [In, Out]igraph_matrix_t res, igraph_matrix_t dist, int dim, IntPtr options); 385 [DllImport(X64Dll, EntryPoint = "igraph_layout_mds", CallingConvention = CallingConvention.Cdecl)] 386 private static extern int igraph_layout_mds_x64(igraph_t graph, [In, Out]igraph_matrix_t res, igraph_matrix_t dist, int dim, IntPtr options); 288 387 #endregion 289 388 #endregion … … 309 408 #endregion 310 409 #endregion 410 411 private static int MarshalIfExistsAndCall(object o, Func<IntPtr, int> call) { 412 var ptr = IntPtr.Zero; 413 if (o != null) { 414 try { 415 ptr = Marshal.AllocHGlobal(Marshal.SizeOf(o)); 416 } catch (OutOfMemoryException e) { throw new InvalidOperationException("Not enough memory to perform operation.", e); } 417 Marshal.StructureToPtr(o, ptr, false); 418 } 419 try { 420 return call(ptr); 421 } finally { 422 if (o != null) { 423 Marshal.DestroyStructure(ptr, o.GetType()); 424 Marshal.FreeHGlobal(ptr); 425 } 426 } 427 } 428 429 private static void MarshalIfExistsAndCall(object o, Action<IntPtr> call) { 430 var ptr = IntPtr.Zero; 431 if (o != null) { 432 try { 433 ptr = Marshal.AllocHGlobal(Marshal.SizeOf(o)); 434 } catch (OutOfMemoryException e) { throw new InvalidOperationException("Not enough memory to perform operation.", e); } 435 Marshal.StructureToPtr(o, ptr, false); 436 } 437 try { 438 call(ptr); 439 } finally { 440 if (o != null) { 441 Marshal.DestroyStructure(ptr, o.GetType()); 442 Marshal.FreeHGlobal(ptr); 443 } 444 } 445 } 311 446 } 312 447 } -
branches/symbreg-factors-2650/HeuristicLab.ExtLibs/HeuristicLab.Igraph/0.8.0-pre/HeuristicLab.Igraph-0.8.0-pre/Wrappers/Graph.cs
r14276 r14277 86 86 } 87 87 public Matrix LayoutWithFruchtermanReingold(int niter, double startTemp, Matrix initialCoords = null) { 88 if (initialCoords != null && (initialCoords.Rows != graph.n|| initialCoords.Columns != 2))88 if (initialCoords != null && (initialCoords.Rows != Vertices || initialCoords.Columns != 2)) 89 89 throw new ArgumentException("Initial coordinate matrix does not contain the required number of rows and columns.", "initialCoords"); 90 var coords = initialCoords != null ? new Matrix(initialCoords) : new Matrix( graph.n, 2);90 var coords = initialCoords != null ? new Matrix(initialCoords) : new Matrix(Vertices, 2); 91 91 DllImporter.igraph_layout_fruchterman_reingold(graph, coords.NativeInstance, initialCoords != null, niter, startTemp, igraph_layout_grid_t.IGRAPH_LAYOUT_AUTOGRID, null, null, null, null, null); 92 92 return coords; … … 97 97 } 98 98 public Matrix LayoutWithKamadaKawai(int maxiter, double epsilon, double kkconst, Matrix initialCoords = null) { 99 if (initialCoords != null && (initialCoords.Rows != graph.n|| initialCoords.Columns != 2))99 if (initialCoords != null && (initialCoords.Rows != Vertices || initialCoords.Columns != 2)) 100 100 throw new ArgumentException("Initial coordinate matrix does not contain the required number of rows and columns.", "initialCoords"); 101 var coords = initialCoords != null ? new Matrix(initialCoords) : new Matrix( graph.n, 2);101 var coords = initialCoords != null ? new Matrix(initialCoords) : new Matrix(Vertices, 2); 102 102 DllImporter.igraph_layout_kamada_kawai(graph, coords.NativeInstance, initialCoords != null, maxiter, epsilon, kkconst, null, null, null, null, null); 103 103 return coords; … … 109 109 } 110 110 public Matrix LayoutWithDavidsonHarel(int maxiter, int fineiter, double cool_fact, double weight_node_dist, double weight_border, double weight_edge_lengths, double weight_edge_crossings, double weight_node_edge_dist, Matrix initialCoords = null) { 111 if (initialCoords != null && (initialCoords.Rows != graph.n|| initialCoords.Columns != 2))111 if (initialCoords != null && (initialCoords.Rows != Vertices || initialCoords.Columns != 2)) 112 112 throw new ArgumentException("Initial coordinate matrix does not contain the required number of rows and columns.", "initialCoords"); 113 var coords = initialCoords != null ? new Matrix(initialCoords) : new Matrix( graph.n, 2);113 var coords = initialCoords != null ? new Matrix(initialCoords) : new Matrix(Vertices, 2); 114 114 DllImporter.igraph_layout_davidson_harel(graph, coords.NativeInstance, initialCoords != null, maxiter, fineiter, cool_fact, weight_node_dist, weight_border, weight_edge_lengths, weight_edge_crossings, weight_node_edge_dist); 115 115 return coords; 116 116 } 117 118 /// <summary> 119 /// Use multi-dimensional scaling to layout vertices. 120 /// A distance matrix can be used to specify the distances between the vertices. 121 /// Otherwise the distances will be calculated by shortest-path-length. 122 /// </summary> 123 /// <remarks> 124 /// For disconnected graphs, dimension must be 2. 125 /// </remarks> 126 /// <param name="dist">The distance matrix to layout the vertices.</param> 127 /// <param name="dim">How many dimensions should be used.</param> 128 /// <returns>The coordinates matrix of the aligned vertices.</returns> 129 public Matrix LayoutWithMds(Matrix dist = null, int dim = 2) { 130 var coords = new Matrix(Vertices, dim); 131 DllImporter.igraph_layout_mds(graph, coords.NativeInstance, dist != null ? dist.NativeInstance : null, dim); 132 return coords; 133 } 134 135 public void BreadthFirstWalk(BreadthFirstHandler handler, int root, DirectedWalkMode mode, bool includeUnreachableFromRoot = false, object tag = null) { 136 igraph_bfshandler_t wrapper = (t, vid, pred, succ, rank, dist, extra) => handler != null && handler(this, vid, pred, succ, rank, dist, tag); 137 DllImporter.igraph_bfs(graph, root, null, (igraph_neimode_t)mode, includeUnreachableFromRoot, null, null, null, null, null, null, null, wrapper, tag); 138 } 139 140 public void DepthFirstWalk(DepthFirstHandler inHandler, DepthFirstHandler outHandler, int root, DirectedWalkMode mode, bool includeUnreachableFromRoot = false, object tag = null) { 141 igraph_dfshandler_t inWrapper = (t, vid, dist, extra) => inHandler != null && inHandler(this, vid, dist, tag); 142 igraph_dfshandler_t outWrapper = (t, vid, dist, extra) => outHandler != null && outHandler(this, vid, dist, tag); 143 DllImporter.igraph_dfs(graph, root, (igraph_neimode_t)mode, includeUnreachableFromRoot, null, null, null, null, inWrapper, outWrapper, tag); 144 } 117 145 } 118 146 } -
branches/symbreg-factors-2650/HeuristicLab.ExtLibs/HeuristicLab.Igraph/0.8.0-pre/HeuristicLab.Igraph-0.8.0-pre/Wrappers/Matrix.cs
r14276 r14277 39 39 DllImporter.igraph_matrix_copy(matrix, other.NativeInstance); 40 40 } 41 public Matrix(double[,] mat) { 42 if (mat == null) throw new ArgumentNullException("mat"); 43 matrix = new igraph_matrix_t(); 44 var nrows = mat.GetLength(0); 45 var ncols = mat.GetLength(1); 46 DllImporter.igraph_matrix_init(matrix, nrows, ncols); 47 var colwise = new double[ncols * nrows]; 48 for (var j = 0; j < ncols; j++) 49 for (var i = 0; i < nrows; i++) 50 colwise[j * nrows + i] = mat[i, j]; 51 DllImporter.igraph_vector_init_copy(matrix.data, colwise); 52 } 41 53 ~Matrix() { 42 54 DllImporter.igraph_matrix_destroy(matrix); … … 48 60 matrix = null; 49 61 GC.SuppressFinalize(this); 62 } 63 64 public void Fill(double v) { 65 DllImporter.igraph_matrix_fill(matrix, v); 66 } 67 68 public void Transpose() { 69 DllImporter.igraph_matrix_transpose(matrix); 70 } 71 72 public void Scale(double by) { 73 DllImporter.igraph_matrix_scale(matrix, by); 50 74 } 51 75 -
branches/symbreg-factors-2650/HeuristicLab.ExtLibs/HeuristicLab.Igraph/0.8.0-pre/HeuristicLab.Igraph-0.8.0-pre/Wrappers/Vector.cs
r14276 r14277 21 21 22 22 using System; 23 using System.Collections.Generic; 24 using System.Linq; 23 25 24 26 namespace HeuristicLab.IGraph.Wrappers { … … 39 41 DllImporter.igraph_vector_init(vector, length); 40 42 } 41 43 public Vector(IEnumerable<double> data) { 44 if (data == null) throw new ArgumentNullException("data"); 45 var vec = data.ToArray(); 46 vector = new igraph_vector_t(); 47 DllImporter.igraph_vector_init_copy(vector, vec); 48 } 42 49 public Vector(Vector other) { 43 50 if (other == null) throw new ArgumentNullException("other"); … … 45 52 DllImporter.igraph_vector_copy(vector, other.NativeInstance); 46 53 } 47 48 54 ~Vector() { 49 55 DllImporter.igraph_vector_destroy(vector); … … 55 61 vector = null; 56 62 GC.SuppressFinalize(this); 63 } 64 65 public void Fill(double v) { 66 DllImporter.igraph_vector_fill(vector, v); 67 } 68 69 public void Reverse() { 70 DllImporter.igraph_vector_reverse(vector); 71 } 72 73 public void Shuffle() { 74 DllImporter.igraph_vector_shuffle(vector); 75 } 76 77 public void Scale(double by) { 78 DllImporter.igraph_vector_scale(vector, by); 57 79 } 58 80 … … 69 91 70 92 public double[] ToArray() { 71 var result = new double[Length]; 72 for (var i = 0; i < result.Length; i++) { 73 result[i] = DllImporter.igraph_vector_e(vector, i); 74 } 75 return result; 93 return DllImporter.igraph_vector_to_array(vector); 76 94 } 77 95 }
Note: See TracChangeset
for help on using the changeset viewer.