ruby-gsl-ng 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/History.txt +6 -1
- data/Manifest.txt +12 -4
- data/README.txt +5 -2
- data/Rakefile +1 -0
- data/ext/extconf.rb +2 -0
- data/ext/gslng_extensions.cpp +77 -0
- data/lib/gslng/backend.rb +19 -0
- data/lib/gslng/backend_components/error_handling.rb +12 -0
- data/lib/gslng/backend_components/matrix.rb +73 -0
- data/lib/{gsl/backend.rb → gslng/backend_components/vector.rb} +24 -32
- data/lib/gslng/finalizer.rb +5 -0
- data/lib/gslng/matrix.rb +406 -0
- data/lib/gslng/matrix_view.rb +39 -0
- data/lib/gslng/vector.rb +353 -0
- data/lib/gslng/vector_view.rb +39 -0
- data/lib/gslng.rb +11 -0
- data/test/benchmark.rb +49 -0
- data/test/matrix_test.rb +105 -0
- data/test/test_gsl.rb +1 -0
- data/test/vector_test.rb +72 -39
- metadata +17 -9
- data/lib/gsl/finalizer.rb +0 -5
- data/lib/gsl/vector.rb +0 -236
- data/lib/gsl.rb +0 -8
data/History.txt
CHANGED
data/Manifest.txt
CHANGED
@@ -5,10 +5,18 @@ README.txt
|
|
5
5
|
Rakefile
|
6
6
|
ext/extconf.rb
|
7
7
|
ext/gslng_extensions.cpp
|
8
|
-
lib/
|
9
|
-
lib/
|
10
|
-
lib/
|
11
|
-
lib/
|
8
|
+
lib/gslng.rb
|
9
|
+
lib/gslng/backend.rb
|
10
|
+
lib/gslng/backend_components/error_handling.rb
|
11
|
+
lib/gslng/backend_components/matrix.rb
|
12
|
+
lib/gslng/backend_components/vector.rb
|
13
|
+
lib/gslng/finalizer.rb
|
14
|
+
lib/gslng/matrix.rb
|
15
|
+
lib/gslng/matrix_view.rb
|
16
|
+
lib/gslng/vector.rb
|
17
|
+
lib/gslng/vector_view.rb
|
18
|
+
test/benchmark.rb
|
19
|
+
test/matrix_test.rb
|
12
20
|
test/test_gsl.rb
|
13
21
|
test/vector_test.rb
|
14
22
|
|
data/README.txt
CHANGED
data/Rakefile
CHANGED
data/ext/extconf.rb
CHANGED
data/ext/gslng_extensions.cpp
CHANGED
@@ -5,6 +5,7 @@
|
|
5
5
|
*/
|
6
6
|
|
7
7
|
#include <gsl/gsl_vector.h>
|
8
|
+
#include <gsl/gsl_matrix.h>
|
8
9
|
|
9
10
|
extern "C" void Init_gslng_extensions(void) { }
|
10
11
|
|
@@ -26,3 +27,79 @@ extern "C" void gsl_vector_map_index(gsl_vector* v, gsl_vector_index_callback_t
|
|
26
27
|
*gsl_vector_ptr(v, i) = (*callback)(i);
|
27
28
|
}
|
28
29
|
|
30
|
+
// A fast "each" for cases where there's no expected return value from the block
|
31
|
+
typedef void (*gsl_vector_each_callback_t)(double);
|
32
|
+
|
33
|
+
extern "C" void gsl_vector_each(gsl_vector* v, gsl_vector_each_callback_t callback) {
|
34
|
+
for (size_t i = 0; i < v->size; i++)
|
35
|
+
(*callback)(*gsl_vector_const_ptr(v, i));
|
36
|
+
}
|
37
|
+
|
38
|
+
// A fast "each_with_index" for cases where there's no expected return value from the block
|
39
|
+
typedef void (*gsl_vector_each_with_index_callback_t)(double, size_t);
|
40
|
+
|
41
|
+
extern "C" void gsl_vector_each_with_index(gsl_vector* v, gsl_vector_each_with_index_callback_t callback) {
|
42
|
+
for (size_t i = 0; i < v->size; i++)
|
43
|
+
(*callback)(*gsl_vector_const_ptr(v, i), i);
|
44
|
+
}
|
45
|
+
|
46
|
+
// Hide the view in a new vector (gsl_vector_subvector)
|
47
|
+
extern "C" gsl_vector* gsl_vector_subvector_with_stride2(gsl_vector* v, size_t offset, size_t stride, size_t n) {
|
48
|
+
gsl_vector_view view = gsl_vector_subvector_with_stride(v, offset, stride, n);
|
49
|
+
gsl_vector* vector_view = gsl_vector_alloc(view.vector.size);
|
50
|
+
*vector_view = view.vector;
|
51
|
+
return vector_view;
|
52
|
+
}
|
53
|
+
|
54
|
+
// Hide the view in a new vector (gsl_vector_subvector)
|
55
|
+
extern "C" gsl_vector* gsl_vector_subvector2(gsl_vector* v, size_t offset, size_t n) {
|
56
|
+
gsl_vector_view view = gsl_vector_subvector(v, offset, n);
|
57
|
+
gsl_vector* vector_view = gsl_vector_alloc(view.vector.size);
|
58
|
+
*vector_view = view.vector;
|
59
|
+
return vector_view;
|
60
|
+
}
|
61
|
+
|
62
|
+
/***** Matrix *****/
|
63
|
+
// For Matrix::map!
|
64
|
+
typedef double (*gsl_matrix_callback_t)(double);
|
65
|
+
|
66
|
+
extern "C" void gsl_matrix_map(gsl_matrix* m, gsl_matrix_callback_t callback) {
|
67
|
+
size_t size1 = m->size1;
|
68
|
+
size_t size2 = m->size2;
|
69
|
+
|
70
|
+
for (size_t i = 0; i < size1; i++)
|
71
|
+
for (size_t j = 0; j < size2; j++)
|
72
|
+
*gsl_matrix_ptr(m, i, j) = (*callback)(*gsl_matrix_const_ptr(m, i, j));
|
73
|
+
}
|
74
|
+
|
75
|
+
// For Matrix::map_index!
|
76
|
+
typedef double (*gsl_matrix_index_callback_t)(size_t, size_t);
|
77
|
+
|
78
|
+
extern "C" void gsl_matrix_map_index(gsl_matrix* m, gsl_matrix_index_callback_t callback) {
|
79
|
+
size_t size1 = m->size1;
|
80
|
+
size_t size2 = m->size2;
|
81
|
+
|
82
|
+
for (size_t i = 0; i < size1; i++)
|
83
|
+
for (size_t j = 0; j < size2; j++)
|
84
|
+
*gsl_matrix_ptr(m, i, j) = (*callback)(i, j);
|
85
|
+
}
|
86
|
+
|
87
|
+
// A fast "each" for cases where there's no expected return value from the block
|
88
|
+
typedef void (*gsl_matrix_each_callback_t)(double);
|
89
|
+
|
90
|
+
extern "C" void gsl_matrix_each(gsl_matrix* m, gsl_matrix_each_callback_t callback) {
|
91
|
+
size_t size1 = m->size1;
|
92
|
+
size_t size2 = m->size2;
|
93
|
+
|
94
|
+
for (size_t i = 0; i < size1; i++)
|
95
|
+
for (size_t j = 0; j < size2; j++)
|
96
|
+
(*callback)(*gsl_matrix_const_ptr(m, i, j));
|
97
|
+
}
|
98
|
+
|
99
|
+
// Hide the view in a new matrix (gsl_matrix_submatrix)
|
100
|
+
extern "C" gsl_matrix* gsl_matrix_submatrix2(gsl_matrix* m_ptr, size_t x, size_t y, size_t n, size_t m) {
|
101
|
+
gsl_matrix_view view = gsl_matrix_submatrix(m_ptr, x, y, n, m);
|
102
|
+
gsl_matrix* matrix_view = gsl_matrix_alloc(view.matrix.size1, view.matrix.size2);
|
103
|
+
*matrix_view = view.matrix;
|
104
|
+
return matrix_view;
|
105
|
+
}
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'ffi'
|
2
|
+
|
3
|
+
module GSLng
|
4
|
+
# Anonymous module: avoids exposing this internal module when doing "include GSLng" at the top-level.
|
5
|
+
# If ruby had "private" modules I wouldn't have to do this.
|
6
|
+
@backend = Module.new do
|
7
|
+
extend FFI::Library
|
8
|
+
end
|
9
|
+
|
10
|
+
# Returns the internal backend module
|
11
|
+
def GSLng.backend
|
12
|
+
@backend
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
require 'gslng_extensions'
|
17
|
+
require 'gslng/backend_components/vector'
|
18
|
+
require 'gslng/backend_components/matrix'
|
19
|
+
require 'gslng/backend_components/error_handling'
|
@@ -0,0 +1,12 @@
|
|
1
|
+
module GSLng #:nodoc:
|
2
|
+
backend.instance_eval do
|
3
|
+
# All of this raises an exception when GSL registers an error
|
4
|
+
callback :error_handler_callback, [ :string, :string, :int, :int ], :void
|
5
|
+
attach_function :gsl_set_error_handler, [ :error_handler_callback ], :error_handler_callback
|
6
|
+
|
7
|
+
ErrorHandlerCallback = Proc.new {|reason, file, line, errno|
|
8
|
+
raise RuntimeError, "#{reason} (errno: #{errno})", caller[2..-1]
|
9
|
+
}
|
10
|
+
gsl_set_error_handler(ErrorHandlerCallback)
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,73 @@
|
|
1
|
+
module GSLng
|
2
|
+
backend.instance_eval do
|
3
|
+
# memory handling
|
4
|
+
attach_function :gsl_matrix_alloc, [ :size_t, :size_t ], :pointer
|
5
|
+
attach_function :gsl_matrix_calloc, [ :size_t, :size_t ], :pointer
|
6
|
+
attach_function :gsl_matrix_free, [ :pointer ], :void
|
7
|
+
|
8
|
+
# initializing
|
9
|
+
attach_function :gsl_matrix_set_all, [ :pointer, :double ], :void
|
10
|
+
attach_function :gsl_matrix_set_zero, [ :pointer ], :void
|
11
|
+
attach_function :gsl_matrix_set_identity, [ :pointer ], :void
|
12
|
+
|
13
|
+
# copying
|
14
|
+
attach_function :gsl_matrix_memcpy, [ :pointer, :pointer ], :int
|
15
|
+
|
16
|
+
# operations
|
17
|
+
attach_function :gsl_matrix_add, [ :pointer, :pointer ], :int
|
18
|
+
attach_function :gsl_matrix_sub, [ :pointer, :pointer ], :int
|
19
|
+
attach_function :gsl_matrix_mul_elements, [ :pointer, :pointer ], :int
|
20
|
+
attach_function :gsl_matrix_div_elements, [ :pointer, :pointer ], :int
|
21
|
+
attach_function :gsl_matrix_scale, [ :pointer, :double ], :int
|
22
|
+
attach_function :gsl_matrix_add_constant, [ :pointer, :double ], :int
|
23
|
+
|
24
|
+
# copy rows/columns into
|
25
|
+
attach_function :gsl_matrix_get_row, [ :pointer, :pointer, :size_t ], :int
|
26
|
+
attach_function :gsl_matrix_get_col, [ :pointer, :pointer, :size_t ], :int
|
27
|
+
attach_function :gsl_matrix_set_row, [ :pointer, :size_t, :pointer ], :int
|
28
|
+
attach_function :gsl_matrix_set_col, [ :pointer, :size_t, :pointer ], :int
|
29
|
+
|
30
|
+
# element access
|
31
|
+
attach_function :gsl_matrix_get, [ :pointer, :size_t, :size_t ], :double
|
32
|
+
attach_function :gsl_matrix_set, [ :pointer, :size_t, :size_t, :double ], :void
|
33
|
+
|
34
|
+
# properties
|
35
|
+
attach_function :gsl_matrix_isnull, [ :pointer ], :int
|
36
|
+
attach_function :gsl_matrix_ispos, [ :pointer ], :int
|
37
|
+
attach_function :gsl_matrix_isneg, [ :pointer ], :int
|
38
|
+
attach_function :gsl_matrix_isnonneg, [ :pointer ], :int
|
39
|
+
|
40
|
+
# max and min
|
41
|
+
attach_function :gsl_matrix_max, [ :pointer ], :double
|
42
|
+
attach_function :gsl_matrix_min, [ :pointer ], :double
|
43
|
+
attach_function :gsl_matrix_minmax, [ :pointer, :buffer_out, :buffer_out ], :void
|
44
|
+
attach_function :gsl_matrix_max_index, [ :pointer, :buffer_out, :buffer_out ], :void
|
45
|
+
attach_function :gsl_matrix_min_index, [ :pointer, :buffer_out, :buffer_out ], :void
|
46
|
+
attach_function :gsl_matrix_minmax_index, [ :pointer, :buffer_out, :buffer_out, :buffer_out, :buffer_out ], :void
|
47
|
+
|
48
|
+
# exchange elements
|
49
|
+
attach_function :gsl_matrix_swap_rows, [ :pointer, :size_t, :size_t ], :int
|
50
|
+
attach_function :gsl_matrix_swap_columns, [ :pointer, :size_t, :size_t ], :int
|
51
|
+
attach_function :gsl_matrix_swap_rowcol, [ :pointer, :size_t, :size_t ], :int
|
52
|
+
attach_function :gsl_matrix_transpose_memcpy, [ :pointer, :pointer ], :int
|
53
|
+
attach_function :gsl_matrix_transpose, [ :pointer ], :int
|
54
|
+
|
55
|
+
# From local extension
|
56
|
+
callback :gsl_matrix_callback, [ :double ], :double
|
57
|
+
attach_function :gsl_matrix_map, [ :pointer, :gsl_matrix_callback ], :void
|
58
|
+
|
59
|
+
callback :gsl_matrix_index_callback, [ :size_t, :size_t ], :double
|
60
|
+
attach_function :gsl_matrix_map_index, [ :pointer, :gsl_matrix_index_callback ], :void
|
61
|
+
|
62
|
+
callback :gsl_matrix_each_callback, [ :double ], :void
|
63
|
+
attach_function :gsl_matrix_each, [ :pointer, :gsl_matrix_each_callback ], :void
|
64
|
+
|
65
|
+
# views
|
66
|
+
attach_function :gsl_matrix_submatrix2, [ :pointer, :size_t, :size_t, :size_t, :size_t ], :pointer
|
67
|
+
|
68
|
+
# BLAS interface
|
69
|
+
enum :cblas_transpose_t, [ :no_transpose, 111, :transpose, :conjugate_transpose ]
|
70
|
+
attach_function :gsl_blas_dgemv, [ :cblas_transpose_t, :double, :pointer, :pointer, :double, :pointer ], :int
|
71
|
+
attach_function :gsl_blas_dgemm, [ :cblas_transpose_t, :cblas_transpose_t, :double, :pointer, :pointer, :double, :pointer ], :int
|
72
|
+
end
|
73
|
+
end
|
@@ -1,22 +1,15 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
# TODO: get a way to properly define the type of size_t (assumed to be :uint)
|
5
|
-
#
|
6
|
-
module Backend
|
7
|
-
extend FFI::Library
|
8
|
-
|
9
|
-
##----- Vector ------##
|
10
|
-
# memory handling
|
1
|
+
module GSLng
|
2
|
+
backend.instance_eval do
|
3
|
+
# memory handling
|
11
4
|
attach_function :gsl_vector_alloc, [ :size_t ], :pointer
|
12
5
|
attach_function :gsl_vector_calloc, [ :size_t ], :pointer
|
13
6
|
attach_function :gsl_vector_free, [ :pointer ], :void
|
14
|
-
|
7
|
+
|
15
8
|
# initializing
|
16
9
|
attach_function :gsl_vector_set_all, [ :pointer, :double ], :void
|
17
10
|
attach_function :gsl_vector_set_zero, [ :pointer ], :void
|
18
11
|
attach_function :gsl_vector_set_basis, [ :pointer, :size_t ], :int
|
19
|
-
|
12
|
+
|
20
13
|
# operations
|
21
14
|
attach_function :gsl_vector_add, [ :pointer, :pointer ], :int
|
22
15
|
attach_function :gsl_vector_sub, [ :pointer, :pointer ], :int
|
@@ -24,17 +17,17 @@ module GSL
|
|
24
17
|
attach_function :gsl_vector_div, [ :pointer, :pointer ], :int
|
25
18
|
attach_function :gsl_vector_scale, [ :pointer, :double ], :int
|
26
19
|
attach_function :gsl_vector_add_constant, [ :pointer, :double ], :int
|
27
|
-
|
20
|
+
|
28
21
|
# element access
|
29
22
|
attach_function :gsl_vector_get, [ :pointer, :size_t ], :double
|
30
23
|
attach_function :gsl_vector_set, [ :pointer, :size_t, :double ], :void
|
31
|
-
|
24
|
+
|
32
25
|
# properties
|
33
26
|
attach_function :gsl_vector_isnull, [ :pointer ], :int
|
34
27
|
attach_function :gsl_vector_ispos, [ :pointer ], :int
|
35
28
|
attach_function :gsl_vector_isneg, [ :pointer ], :int
|
36
29
|
attach_function :gsl_vector_isnonneg, [ :pointer ], :int
|
37
|
-
|
30
|
+
|
38
31
|
# max and min
|
39
32
|
attach_function :gsl_vector_max, [ :pointer ], :double
|
40
33
|
attach_function :gsl_vector_min, [ :pointer ], :double
|
@@ -42,15 +35,14 @@ module GSL
|
|
42
35
|
attach_function :gsl_vector_max_index, [ :pointer ], :size_t
|
43
36
|
attach_function :gsl_vector_min_index, [ :pointer ], :size_t
|
44
37
|
attach_function :gsl_vector_minmax_index, [ :pointer, :buffer_out, :buffer_out ], :void
|
45
|
-
|
38
|
+
|
46
39
|
# copying
|
47
40
|
attach_function :gsl_vector_memcpy, [ :pointer, :pointer ], :int
|
48
|
-
|
49
|
-
|
41
|
+
|
50
42
|
# exchanging elements
|
51
43
|
attach_function :gsl_vector_swap_elements, [ :pointer, :size_t, :size_t ], :int
|
52
44
|
attach_function :gsl_vector_reverse, [ :pointer ], :int
|
53
|
-
|
45
|
+
|
54
46
|
# BLAS functions
|
55
47
|
attach_function :gsl_blas_ddot, [ :pointer, :pointer, :buffer_out ], :int
|
56
48
|
attach_function :gsl_blas_dnrm2, [ :pointer ], :double
|
@@ -60,24 +52,24 @@ module GSL
|
|
60
52
|
attach_function :gsl_blas_daxpy, [ :double, :pointer, :pointer ], :int
|
61
53
|
attach_function :gsl_blas_dscal, [ :double, :pointer ], :void
|
62
54
|
|
55
|
+
# views
|
56
|
+
attach_function :gsl_vector_subvector2, [ :pointer, :size_t, :size_t ], :pointer
|
57
|
+
attach_function :gsl_vector_subvector_with_stride2, [ :pointer, :size_t, :size_t, :size_t ], :pointer
|
58
|
+
|
63
59
|
# From local extension
|
64
|
-
callback :gsl_vector_callback, [ :double ], :double
|
60
|
+
callback :gsl_vector_callback, [ :double ], :double
|
65
61
|
attach_function :gsl_vector_map, [ :pointer, :gsl_vector_callback ], :void
|
66
62
|
|
67
63
|
callback :gsl_vector_index_callback, [ :size_t ], :double
|
68
64
|
attach_function :gsl_vector_map_index, [ :pointer, :gsl_vector_index_callback ], :void
|
69
65
|
|
66
|
+
callback :gsl_vector_each_callback, [ :double ], :void
|
67
|
+
attach_function :gsl_vector_each, [ :pointer, :gsl_vector_each_callback ], :void
|
68
|
+
|
69
|
+
callback :gsl_vector_each_with_index_callback, [ :double, :size_t ], :void
|
70
|
+
attach_function :gsl_vector_each_with_index, [ :pointer, :gsl_vector_each_with_index_callback ], :void
|
71
|
+
|
70
72
|
# Sorting
|
71
73
|
attach_function :gsl_sort_vector, [ :pointer ], :void
|
72
|
-
|
73
|
-
|
74
|
-
callback :error_handler_callback, [ :string, :string, :int, :int ], :void
|
75
|
-
attach_function :gsl_set_error_handler, [ :error_handler_callback ], :error_handler_callback
|
76
|
-
|
77
|
-
# TODO: pop this block from the exception stack so that it seems to be coming from the original gsl function
|
78
|
-
ErrorHandlerCallback = Proc.new {|reason, file, line, errno|
|
79
|
-
raise RuntimeError, "#{reason} at #{file}:#{line} (errno: #{errno})"
|
80
|
-
}
|
81
|
-
gsl_set_error_handler(ErrorHandlerCallback)
|
82
|
-
end
|
83
|
-
end
|
74
|
+
end
|
75
|
+
end
|