ruby-gsl-ng 0.2.3 → 0.2.4

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 CHANGED
@@ -1,3 +1,14 @@
1
+ === 0.2.4
2
+ * Features:
3
+ * Plotting support (using gnuplot) (Plotter class and associated methods on Matrix).
4
+ * Added Matrix#map_array (just like Vector#map_array)
5
+ * C version of operator []
6
+ * Support for some statistics operations in Vector
7
+ * Updated documentation to use YARD's @group feature
8
+ * Internal Changes:
9
+ * GSL memory is managed by FFI::AutoPointer now
10
+ * Fixes
11
+ * On some systems, with Ruby 1.8 the extension was missing libstdc++ support
1
12
  === 0.2.3
2
13
  * FIXES:
3
14
  * HUGE memory leak, no GSL object was ever freed.
data/Manifest CHANGED
@@ -1,19 +1,20 @@
1
1
  History.txt
2
2
  README.rdoc
3
3
  Rakefile
4
- TODO
5
4
  ext/extconf.rb
6
5
  ext/gslng_extensions.cpp
6
+ ext/plotting.cpp
7
7
  lib/gslng.rb
8
8
  lib/gslng/backend.rb
9
9
  lib/gslng/backend_components/error_handling.rb
10
10
  lib/gslng/backend_components/matrix.rb
11
11
  lib/gslng/backend_components/rng.rb
12
12
  lib/gslng/backend_components/special.rb
13
+ lib/gslng/backend_components/stats.rb
13
14
  lib/gslng/backend_components/vector.rb
14
- lib/gslng/finalizer.rb
15
15
  lib/gslng/matrix.rb
16
16
  lib/gslng/matrix_view.rb
17
+ lib/gslng/plotter.rb
17
18
  lib/gslng/rng/gaussian.rb
18
19
  lib/gslng/rng/rng.rb
19
20
  lib/gslng/rng/uniform.rb
data/Rakefile CHANGED
@@ -6,9 +6,9 @@ require 'yard'
6
6
 
7
7
  Echoe.new('ruby-gsl-ng') do |p|
8
8
  p.author = 'v01d'
9
- p.summary = "Ruby Object Oriented Graph LIbrary"
9
+ p.summary = "Ruby/GSL new-generation wrapper"
10
10
  p.url = "http://github.com/v01d/ruby-gsl-ng"
11
- p.version = "0.2.3"
11
+ p.version = "0.2.4"
12
12
  p.dependencies = ['yard', 'ffi']
13
13
  # p.eval = proc { s.has_rdoc = 'yard' }
14
14
  end
data/ext/extconf.rb CHANGED
@@ -1,6 +1,14 @@
1
1
  #!/usr/bin/ruby
2
2
  require 'mkmf'
3
+
4
+ extra_flags='-O4 -DHAVE_INLINE=1'
5
+
6
+ ## Check for GSL
3
7
  gsl_vars = pkg_config('gsl') or raise 'GSL not found!'
4
- extra_flags='-O4 -DHAVE_INLINE'
8
+
9
+ # Configuration
10
+ if (RUBY_VERSION =~ /^1\.8/) then $libs << ' -lstdc++' end # Seems necessary in some cases
11
+
12
+ ## Create Makefile
5
13
  with_cppflags("#{extra_flags}") { true }
6
14
  create_makefile('gslng_extensions')
@@ -66,6 +66,13 @@ static VALUE gsl_vector_from_array(VALUE self, VALUE ptr, VALUE array) {
66
66
  return self;
67
67
  }
68
68
 
69
+ static VALUE gsl_vector_get_operator(VALUE self, VALUE ptr, VALUE element) {
70
+ gsl_vector* v = (gsl_vector*)FIX2ULONG(ptr);
71
+ long i = FIX2LONG(element);
72
+ if (i < 0) { i = v->size + i; }
73
+ return rb_float_new(gsl_vector_get(v, (size_t)i));
74
+ }
75
+
69
76
  // Hide the view in a new vector (gsl_vector_subvector)
70
77
  extern "C" gsl_vector* gsl_vector_subvector_with_stride2(gsl_vector* v, size_t offset, size_t stride, size_t n) {
71
78
  gsl_vector_view view = gsl_vector_subvector_with_stride(v, offset, stride, n);
@@ -82,6 +89,10 @@ extern "C" gsl_vector* gsl_vector_subvector2(gsl_vector* v, size_t offset, size_
82
89
  return vector_view;
83
90
  }
84
91
 
92
+ extern "C" double* gsl_vector_as_array(gsl_vector* v) {
93
+ return v->data;
94
+ }
95
+
85
96
  /************************* Matrix functions *****************************/
86
97
 
87
98
  static VALUE gsl_matrix_map(VALUE self, VALUE ptr) {
@@ -96,6 +107,21 @@ static VALUE gsl_matrix_map(VALUE self, VALUE ptr) {
96
107
  return self;
97
108
  }
98
109
 
110
+ static VALUE gsl_matrix_map_array(VALUE self, VALUE ptr) {
111
+ gsl_matrix* m = (gsl_matrix*)FIX2ULONG(ptr);
112
+
113
+ VALUE array = rb_ary_new2(m->size1);
114
+ for (size_t i = 0; i < m->size1; i++) {
115
+ VALUE row = rb_ary_new2(m->size2);
116
+ for (size_t j = 0; j < m->size2; j++) {
117
+ rb_ary_store(row, j, rb_yield(rb_float_new(gsl_matrix_get(m, i, j))));
118
+ }
119
+ rb_ary_store(array, i, row);
120
+ }
121
+
122
+ return array;
123
+ }
124
+
99
125
  static VALUE gsl_matrix_map_index(VALUE self, VALUE ptr) {
100
126
  gsl_matrix* m = (gsl_matrix*)FIX2ULONG(ptr);
101
127
  size_t size1 = m->size1;
@@ -206,6 +232,7 @@ extern "C" void Init_gslng_extensions(void) {
206
232
  VALUE Backend_module = rb_funcall(GSLng_module, rb_intern("backend"), 0);
207
233
 
208
234
  // vector
235
+ rb_define_module_function(Backend_module, "gsl_vector_get_operator", (VALUE(*)(ANYARGS))gsl_vector_get_operator, 2);
209
236
  rb_define_module_function(Backend_module, "gsl_vector_map!", (VALUE(*)(ANYARGS))gsl_vector_map, 1);
210
237
  rb_define_module_function(Backend_module, "gsl_vector_map_index!", (VALUE(*)(ANYARGS))gsl_vector_map_index, 1);
211
238
  rb_define_module_function(Backend_module, "gsl_vector_each_with_index", (VALUE(*)(ANYARGS))gsl_vector_each_with_index, 1);
@@ -215,10 +242,11 @@ extern "C" void Init_gslng_extensions(void) {
215
242
 
216
243
  // matrix
217
244
  rb_define_module_function(Backend_module, "gsl_matrix_map!", (VALUE(*)(ANYARGS))gsl_matrix_map, 1);
245
+ rb_define_module_function(Backend_module, "gsl_matrix_map_array", (VALUE(*)(ANYARGS))gsl_matrix_map_array, 1);
218
246
  rb_define_module_function(Backend_module, "gsl_matrix_map_index!", (VALUE(*)(ANYARGS))gsl_matrix_map_index, 1);
219
247
  rb_define_module_function(Backend_module, "gsl_matrix_map_with_index!", (VALUE(*)(ANYARGS))gsl_matrix_map_with_index, 1);
220
248
  rb_define_module_function(Backend_module, "gsl_matrix_each_with_index", (VALUE(*)(ANYARGS))gsl_matrix_each_with_index, 1);
221
249
  rb_define_module_function(Backend_module, "gsl_matrix_each", (VALUE(*)(ANYARGS))gsl_matrix_each, 1);
222
250
  rb_define_module_function(Backend_module, "gsl_matrix_to_a", (VALUE(*)(ANYARGS))gsl_matrix_to_a, 1);
223
251
  rb_define_module_function(Backend_module, "gsl_matrix_from_array", (VALUE(*)(ANYARGS))gsl_matrix_from_array, 2);
224
- }
252
+ }
data/ext/plotting.cpp ADDED
@@ -0,0 +1,9 @@
1
+ #include <gsl/gsl_matrix.h>
2
+ #include <unistd.h>
3
+
4
+ extern "C" int gsl_matrix_putdata(gsl_matrix* m, int fd) {
5
+ size_t bytes = m->size1 * m->size2 * sizeof(double);
6
+ long ret = write(fd, m->data, bytes);
7
+ if (ret == -1 || (ulong)ret < bytes) return errno;
8
+ else return 0;
9
+ }
data/lib/gslng.rb CHANGED
@@ -1,6 +1,6 @@
1
1
  require 'gslng/backend'
2
- require 'gslng/finalizer'
3
2
 
3
+ require 'gslng/plotter'
4
4
  require 'gslng/vector'
5
5
  require 'gslng/vector_view'
6
6
  require 'gslng/matrix'
data/lib/gslng/backend.rb CHANGED
@@ -20,3 +20,4 @@ require 'gslng/backend_components/matrix'
20
20
  require 'gslng/backend_components/error_handling'
21
21
  require 'gslng/backend_components/rng'
22
22
  require 'gslng/backend_components/special'
23
+ require 'gslng/backend_components/stats'
@@ -62,5 +62,8 @@ module GSLng
62
62
  enum :cblas_transpose_t, [ :no_transpose, 111, :transpose, :conjugate_transpose ]
63
63
  attach_function :gsl_blas_dgemv, [ :cblas_transpose_t, :double, :pointer, :pointer, :double, :pointer ], :int
64
64
  attach_function :gsl_blas_dgemm, [ :cblas_transpose_t, :cblas_transpose_t, :double, :pointer, :pointer, :double, :pointer ], :int
65
+
66
+ # communication to gnuplot
67
+ attach_function :gsl_matrix_putdata, [ :pointer, :int ], :int
65
68
  end
66
69
  end
@@ -0,0 +1,35 @@
1
+ module GSLng
2
+ backend.instance_eval do
3
+ # mean, sd and variance
4
+ attach_function :gsl_stats_mean, [ :pointer, :size_t, :size_t ], :double
5
+ attach_function :gsl_stats_variance, [ :pointer, :size_t, :size_t ], :double
6
+ attach_function :gsl_stats_variance_m, [ :pointer, :size_t, :size_t, :double ], :double
7
+ attach_function :gsl_stats_sd, [ :pointer, :size_t, :size_t ], :double
8
+ attach_function :gsl_stats_sd_m, [ :pointer, :size_t, :size_t, :double ], :double
9
+ attach_function :gsl_stats_tss, [ :pointer, :size_t, :size_t ], :double
10
+ attach_function :gsl_stats_tss_m, [ :pointer, :size_t, :size_t, :double ], :double
11
+ attach_function :gsl_stats_variance_with_fixed_mean, [ :pointer, :size_t, :size_t, :double ], :double
12
+ attach_function :gsl_stats_sd_with_fixed_mean, [ :pointer, :size_t, :size_t, :double ], :double
13
+
14
+ # absolute deviation
15
+ attach_function :gsl_stats_absdev, [ :pointer, :size_t, :size_t ], :double
16
+ attach_function :gsl_stats_absdev_m, [ :pointer, :size_t, :size_t, :double ], :double
17
+
18
+ # skewness and kurtosis
19
+ attach_function :gsl_stats_skew, [ :pointer, :size_t, :size_t ], :double
20
+ attach_function :gsl_stats_skew_m_sd, [ :pointer, :size_t, :size_t, :double, :double ], :double
21
+ attach_function :gsl_stats_kurtosis, [ :pointer, :size_t, :size_t ], :double
22
+ attach_function :gsl_stats_kurtosis_m_sd, [ :pointer, :size_t, :size_t, :double, :double ], :double
23
+
24
+ # autocorrelation
25
+ attach_function :gsl_stats_lag1_autocorrelation, [ :pointer, :size_t, :size_t ], :double
26
+ attach_function :gsl_stats_lag1_autocorrelation_m, [ :pointer, :size_t, :size_t, :double ], :double
27
+
28
+ # covariance
29
+ attach_function :gsl_stats_covariance, [ :pointer, :size_t, :pointer, :size_t, :size_t ], :double
30
+ attach_function :gsl_stats_covariance_m, [ :pointer, :size_t, :pointer, :size_t, :size_t, :double, :double ], :double
31
+
32
+ # correlation
33
+ attach_function :gsl_stats_correlation, [ :pointer, :size_t, :pointer, :size_t, :size_t ], :double
34
+ end
35
+ end
@@ -59,5 +59,6 @@ module GSLng
59
59
  # views
60
60
  attach_function :gsl_vector_subvector2, [ :pointer, :size_t, :size_t ], :pointer
61
61
  attach_function :gsl_vector_subvector_with_stride2, [ :pointer, :size_t, :size_t, :size_t ], :pointer
62
+ attach_function :gsl_vector_as_array, [ :pointer ], :pointer
62
63
  end
63
64
  end
data/lib/gslng/matrix.rb CHANGED
@@ -19,28 +19,30 @@ module GSLng
19
19
  # Shorthand for [{#rows},{#columns}]
20
20
  def size; [ @m, @n ] end
21
21
 
22
- #--------------------- constructors -------------------------#
22
+ # @group Constructors
23
23
 
24
24
  # Create a Matrix of m-by-n (rows and columns). If zero is true, the Matrix is initialized with zeros.
25
25
  # Otherwise, the Matrix will contain garbage.
26
26
  # You can optionally pass a block, in which case {#map_index!} will be called with it (i.e.: it works like Array.new).
27
27
  def initialize(m, n, zero = false)
28
- @ptr = (zero ? GSLng.backend::gsl_matrix_calloc(m, n) : GSLng.backend::gsl_matrix_alloc(m, n))
29
- GSLng.define_finalizer(self, :gsl_matrix_free, @ptr)
30
-
28
+ ptr = zero ? GSLng.backend::gsl_matrix_calloc(m, n) : GSLng.backend::gsl_matrix_alloc(m, n)
29
+ @ptr = FFI::AutoPointer.new(ptr, Matrix.method(:release))
31
30
  @m,@n = m,n
32
31
  if (block_given?) then self.map_index!(Proc.new) end
33
32
  end
34
33
 
35
34
  def initialize_copy(other) # @private
36
- ObjectSpace.undefine_finalizer(self) # TODO: ruby bug?
37
- @ptr = GSLng.backend::gsl_matrix_alloc(other.m, other.n)
38
- GSLng.define_finalizer(self, :gsl_matrix_free, @ptr)
35
+ ptr = GSLng.backend::gsl_matrix_alloc(other.m, other.n)
36
+ @ptr = FFI::AutoPointer.new(ptr, Matrix.method(:release))
39
37
 
40
38
  @m,@n = other.size
41
39
  GSLng.backend::gsl_matrix_memcpy(@ptr, other.ptr)
42
40
  end
43
41
 
42
+ def Matrix.release(ptr) # @private
43
+ GSLng.backend.gsl_matrix_free(ptr)
44
+ end
45
+
44
46
  # Same as Matrix.new(m, n, true)
45
47
  def Matrix.zero(m, n); Matrix.new(m, n, true) end
46
48
 
@@ -79,20 +81,7 @@ module GSLng
79
81
  end
80
82
  class << self; alias_method :rand, :random end
81
83
 
82
- #--------------------- setting values -------------------------#
83
-
84
- # Set all values to _v_
85
- def all!(v); GSLng.backend::gsl_matrix_set_all(@ptr, v); return self end
86
- alias_method :set!, :all!
87
- alias_method :fill!, :all!
88
-
89
- # Set all values to zero
90
- def zero!; GSLng.backend::gsl_matrix_set_zero(@ptr); return self end
91
-
92
- # Set the identity matrix values
93
- def identity; GSLng.backend::gsl_matrix_set_identity(@ptr); return self end
94
-
95
- #--------------------- set/get -------------------------#
84
+ # @group Setting/getting values
96
85
 
97
86
  # Access the element (i,j), which means (row,column).
98
87
  # Symbols :* or :all can be used as wildcards for both dimensions.
@@ -104,17 +93,19 @@ module GSLng
104
93
  # @raise [RuntimeError] if out-of-bounds
105
94
  # @return [Numeric,Matrix] the element/sub-matrix
106
95
  def [](i, j = :*)
107
- if (Symbol === i && Symbol === j) then return self
108
- elsif (Symbol === i)
109
- col = Vector.new(@m)
110
- GSLng.backend::gsl_matrix_get_col(col.ptr, @ptr, j)
111
- return col.to_matrix
112
- elsif (Symbol === j)
113
- row = Vector.new(@n)
114
- GSLng.backend::gsl_matrix_get_row(row.ptr, @ptr, i)
115
- return row.to_matrix
96
+ if (Integer === i && Integer === j)
97
+ GSLng.backend::gsl_matrix_get(self.ptr, i, j)
116
98
  else
117
- GSLng.backend::gsl_matrix_get(@ptr, i, j)
99
+ if (Symbol === i && Symbol === j) then return self
100
+ elsif (Symbol === i)
101
+ col = Vector.new(@m)
102
+ GSLng.backend::gsl_matrix_get_col(col.ptr, self.ptr, j)
103
+ return col.to_matrix
104
+ elsif (Symbol === j)
105
+ row = Vector.new(@n)
106
+ GSLng.backend::gsl_matrix_get_row(row.ptr, self.ptr, i)
107
+ return row.to_matrix
108
+ end
118
109
  end
119
110
  end
120
111
 
@@ -127,26 +118,37 @@ module GSLng
127
118
  if (Numeric === value) then self.fill!(value)
128
119
  else
129
120
  x,y = self.coerce(value)
130
- GSLng.backend::gsl_matrix_memcpy(@ptr, x.ptr)
121
+ GSLng.backend::gsl_matrix_memcpy(self.ptr, x.ptr)
131
122
  end
132
123
  elsif (Symbol === i)
133
124
  col = Vector.new(@m)
134
125
  x,y = col.coerce(value)
135
- GSLng.backend::gsl_matrix_set_col(@ptr, j, x.ptr)
126
+ GSLng.backend::gsl_matrix_set_col(self.ptr, j, x.ptr)
136
127
  return col
137
128
  elsif (Symbol === j)
138
129
  row = Vector.new(@n)
139
130
  x,y = row.coerce(value)
140
- GSLng.backend::gsl_matrix_set_row(@ptr, i, x.ptr)
131
+ GSLng.backend::gsl_matrix_set_row(self.ptr, i, x.ptr)
141
132
  return row
142
133
  else
143
- GSLng.backend::gsl_matrix_set(@ptr, i, j, value)
134
+ GSLng.backend::gsl_matrix_set(self.ptr, i, j, value)
144
135
  end
145
136
 
146
137
  return self
147
138
  end
148
139
 
149
- #--------------------- view -------------------------#
140
+ # Set all values to _v_
141
+ def all!(v); GSLng.backend::gsl_matrix_set_all(self.ptr, v); return self end
142
+ alias_method :set!, :all!
143
+ alias_method :fill!, :all!
144
+
145
+ # Set all values to zero
146
+ def zero!; GSLng.backend::gsl_matrix_set_zero(self.ptr); return self end
147
+
148
+ # Set the identity matrix values
149
+ def identity; GSLng.backend::gsl_matrix_set_identity(self.ptr); return self end
150
+
151
+ # @group Views
150
152
 
151
153
  # Create a {Matrix::View} from this Matrix.
152
154
  # If either _m_ or _n_ are nil, they're computed from _x_, _y_ and the Matrix's {#size}
@@ -181,7 +183,7 @@ module GSLng
181
183
  def row_vecview(i, offset = 0, size = nil)
182
184
  size = (@n - offset) if size.nil?
183
185
  ptr = GSLng.backend.gsl_matrix_row_view(self.ptr, i, offset, size)
184
- Vector::View.new(ptr, self, offset, size)
186
+ Vector::View.new(ptr, self, size)
185
187
  end
186
188
 
187
189
  # Same as {#column_view}, but returns a {Vector::View}
@@ -189,11 +191,11 @@ module GSLng
189
191
  def column_vecview(i, offset = 0, size = nil)
190
192
  size = (@m - offset) if size.nil?
191
193
  ptr = GSLng.backend.gsl_matrix_column_view(self.ptr, i, offset, size)
192
- Vector::View.new(ptr, self, offset, size)
194
+ Vector::View.new(ptr, self, size)
193
195
  end
194
196
 
195
197
 
196
- #--------------------- operators -------------------------#
198
+ # @group Operators
197
199
 
198
200
  # Add other to self
199
201
  # @return [Matrix] self
@@ -286,7 +288,7 @@ module GSLng
286
288
  end
287
289
  end
288
290
 
289
- #--------------------- swap rows/columns -------------------------#
291
+ # @group Row/column swapping
290
292
 
291
293
  # Transposes in-place. Only for square matrices
292
294
  def transpose!; GSLng.backend::gsl_matrix_transpose(self.ptr); return self end
@@ -303,24 +305,24 @@ module GSLng
303
305
  # Swap the i-th row with the j-th column. The Matrix must be square.
304
306
  def swap_rowcol(i, j); GSLng.backend::gsl_matrix_swap_rowcol(self.ptr, i, j); return self end
305
307
 
306
- #--------------------- predicate methods -------------------------#
308
+ # @group Predicate methods
307
309
 
308
310
  # if all elements are zero
309
- def zero?; GSLng.backend::gsl_matrix_isnull(@ptr) == 1 ? true : false end
311
+ def zero?; GSLng.backend::gsl_matrix_isnull(self.ptr) == 1 ? true : false end
310
312
 
311
313
  # if all elements are strictly positive (>0)
312
- def positive?; GSLng.backend::gsl_matrix_ispos(@ptr) == 1 ? true : false end
314
+ def positive?; GSLng.backend::gsl_matrix_ispos(self.ptr) == 1 ? true : false end
313
315
 
314
316
  #if all elements are strictly negative (<0)
315
- def negative?; GSLng.backend::gsl_matrix_isneg(@ptr) == 1 ? true : false end
317
+ def negative?; GSLng.backend::gsl_matrix_isneg(self.ptr) == 1 ? true : false end
316
318
 
317
319
  # if all elements are non-negative (>=0)
318
- def nonnegative?; GSLng.backend::gsl_matrix_isnonneg(@ptr) == 1 ? true : false end
320
+ def nonnegative?; GSLng.backend::gsl_matrix_isnonneg(self.ptr) == 1 ? true : false end
319
321
 
320
322
  # If this is a column Matrix
321
323
  def column?; self.columns == 1 end
322
324
 
323
- #--------------------- min/max -------------------------#
325
+ # @group Minimum/maximum
324
326
 
325
327
  # Maximum element of the Matrix
326
328
  def max; GSLng.backend::gsl_matrix_max(self.ptr) end
@@ -363,7 +365,7 @@ module GSLng
363
365
  return [i_max[0].get_ulong(0), j_max[0].get_ulong(0)]
364
366
  end
365
367
 
366
- #--------------------- block handling -------------------------#
368
+ # @group High-order methods
367
369
 
368
370
  # Yields the specified block for each element going row-by-row
369
371
  # @yield [elem]
@@ -408,22 +410,27 @@ module GSLng
408
410
 
409
411
  # Efficient {#map!} implementation
410
412
  # @yield [elem]
411
- def map!(block = Proc.new); GSLng.backend::gsl_matrix_map!(@ptr.to_i, &block); return self end
413
+ def map!(block = Proc.new); GSLng.backend::gsl_matrix_map!(self.ptr.to_i, &block); return self end
412
414
 
413
415
  # Alternate version of {#map!}, in this case the block receives the index (row, column) as a parameter.
414
416
  # @yield [i,j]
415
- def map_index!(block = Proc.new); GSLng.backend::gsl_matrix_map_index!(@ptr.to_i, &block); return self end
417
+ def map_index!(block = Proc.new); GSLng.backend::gsl_matrix_map_index!(self.ptr.to_i, &block); return self end
416
418
 
417
419
  # Similar to {#map_index!}, in this case it receives both the element and the index to it
418
420
  # @yield [elem,i,j]
419
- def map_with_index!(block = Proc.new); GSLng.backend::gsl_matrix_map_with_index!(@ptr.to_i, &block); return self end
421
+ def map_with_index!(block = Proc.new); GSLng.backend::gsl_matrix_map_with_index!(self.ptr.to_i, &block); return self end
420
422
 
421
423
  # @see #map!
422
424
  # @return [Matrix]
423
425
  # @yield [elem]
424
426
  def map(block = Proc.new); self.dup.map!(block) end
425
427
 
426
- #--------------------- conversions -------------------------#
428
+ # @see #map
429
+ # @return [Array]
430
+ # @yield [elem]
431
+ def map_array(block = Proc.new); GSLng.backend.gsl_matrix_map_array(self.ptr.to_i, &block) end
432
+
433
+ # @group Type conversions
427
434
 
428
435
  # Same as {Array#join}
429
436
  # @example
@@ -479,7 +486,7 @@ module GSLng
479
486
  end
480
487
  end
481
488
 
482
- #--------------------- equality -------------------------#
489
+ # @group Equality
483
490
 
484
491
  # Element-by-element comparison.
485
492
  def ==(other)
@@ -13,8 +13,13 @@ module GSLng
13
13
  def initialize(owner, x, y, m, n) # @private
14
14
  @owner = owner
15
15
  @m,@n = m,n
16
- @ptr = GSLng.backend::gsl_matrix_submatrix2(owner.ptr, x, y, m, n)
17
- GSLng.define_finalizer(self, :gsl_matrix_free, @ptr)
16
+
17
+ ptr = GSLng.backend::gsl_matrix_submatrix2(owner.ptr, x, y, m, n)
18
+ @ptr = FFI::AutoPointer.new(ptr, View.method(:release))
19
+ end
20
+
21
+ def View.release(ptr)
22
+ GSLng.backend.gsl_matrix_free(ptr)
18
23
  end
19
24
 
20
25
  # Returns a Matrix (*NOT* a View) copied from this view. In other words,
@@ -0,0 +1,83 @@
1
+ require 'singleton'
2
+ require 'ffi'
3
+
4
+ module GSLng
5
+ # This class encapsulates the communication with the plotting backend: gnuplot.
6
+ #
7
+ # Plot data is always represented as a {Matrix}, so you can use {Matrix#plot} to do a single plot.
8
+ # Otherwise, you can use {Matrix#define_plot} (taking the same parameters as the previous method) which returns a {Plotter::Plot}
9
+ # object. By defining multiple plot objects you can then use {Plotter#plot} passing all plot objects as parameters effectively
10
+ # creating a single output of all plots.
11
+ #
12
+ # This class works as {Singleton}, so when you instantiate it the gnuplot process is started. You can also send arbitrary commands
13
+ # to the gnuplot process by using the {Plotter#<<} operator. Read the gnuplot documentation on what are the possible commands you can send.
14
+ #
15
+ class Plotter
16
+ include Singleton
17
+
18
+ attr_reader :io
19
+
20
+ # Creates the singleton Plotter object
21
+ def initialize
22
+ @io = IO.popen('gnuplot -', 'w')
23
+ @io.sync = true
24
+ self << "set datafile nofpe_trap"
25
+ end
26
+
27
+ # Close the pipe. It is desireable to call this in an "ensure" section, to avoid
28
+ # leaving the child gnuplot process there if the main ruby process dies
29
+ def close
30
+ @io.close; @io = nil
31
+ end
32
+
33
+ # Send a command to the gnuplot process
34
+ # @example Setting the xrange
35
+ # Plotter.instance << "set xrange [0:1]"
36
+ def <<(cmd)
37
+ @io.puts(cmd)
38
+ end
39
+
40
+ # Expects a variable number of {Plot} objects and creates a single plot out of them
41
+ def plot(*plots)
42
+ self << 'plot ' + plots.map(&:command).join(', ')
43
+ plots.each {|p| self.put_data(p.matrix)}
44
+ end
45
+
46
+ def put_data(matrix) # @private
47
+ ret = GSLng.backend.gsl_matrix_putdata(matrix.ptr, @io.to_i)
48
+ if (ret != 0) then raise SystemCallError.new("Problem sending data to gnuplot", ret) end
49
+ end
50
+
51
+ # Yields the given block enabling and disabling multiplot mode, before and after the yield respectively
52
+ def multiplot
53
+ self << 'set multiplot'
54
+ yield(self)
55
+ ensure
56
+ self << 'unset multiplot'
57
+ end
58
+
59
+ # This class holds a "plot" command and the associated matrix
60
+ class Plot < Struct.new(:command, :matrix); end
61
+ end
62
+
63
+ class Matrix
64
+ # Create a single plot out of the data contained in this Matrix
65
+ # @param [String] with The value of the 'with' option in gnuplot's plot command (i.e.: lines, linespoints, image, etc.)
66
+ # @param [String] extra_cmds Other variables/modifiers you can optionally pass to the "plot" command
67
+ def plot(with, extra_cmds = '')
68
+ Plotter.instance.plot(define_plot(with, extra_cmds))
69
+ end
70
+
71
+ # Works the same as {#plot} but returns a {Plotter::Plot} object you can store and then pass (along with other plot objects)
72
+ # to {Plotter#plot} and create a single plot out of them
73
+ # @return [Plot] The plot object you can pass to {Plotter#plot}
74
+ def define_plot(with, extra_cmds = '')
75
+ if (with == 'image')
76
+ cmd = "'-' binary array=(#{self.m},#{self.n}) format='%double' #{extra_cmds} with #{with}"
77
+ else
78
+ cmd = "'-' binary record=(#{self.m}) format=\"#{Array.new(self.n,'%double').join('')}\" #{extra_cmds} with #{with}"
79
+ end
80
+ Plotter::Plot.new(cmd, self)
81
+ end
82
+ end
83
+ end
data/lib/gslng/rng/rng.rb CHANGED
@@ -10,15 +10,16 @@ module GSLng
10
10
  if (@type.nil?) then @type = :mt19937 end # update comment above if changed
11
11
 
12
12
  type = GSLng.backend.send(:"gsl_rng_#{@type}")
13
- @ptr = GSLng.backend.gsl_rng_alloc(type)
14
- GSLng.define_finalizer(self, :gsl_rng_free, @ptr)
13
+ @ptr = FFI::AutoPointer.new(GSLng.backend.gsl_rng_alloc(type), RNG.method(:release))
14
+ end
15
+
16
+ def self.release(ptr)
17
+ GSLng.backend.gsl_rng_free(ptr)
15
18
  end
16
19
 
17
20
  def initialize_copy
18
- ObjectSpace.undefine_finalizer(self)
19
21
  type = GSLng.backend.send(:"gsl_rng_#{@type}")
20
- @ptr = GSLng.backend.gsl_rng_alloc(type)
21
- GSLng.define_finalizer(self, :gsl_rng_free, @ptr)
22
+ @ptr = FFI::AutoPointer.new(GSLng.backend.gsl_rng_alloc(type), RNG.method(:release))
22
23
  end
23
24
  end
24
25
  end
data/lib/gslng/vector.rb CHANGED
@@ -14,31 +14,34 @@ module GSLng
14
14
  class Vector
15
15
  include Enumerable
16
16
 
17
- attr_reader :size
17
+ attr_reader :size, :stride
18
18
  attr_reader :ptr # @private
19
19
 
20
- #--------------------- constructors -------------------------#
20
+ # @group Constructors
21
21
 
22
22
  # Create a Vector of size n. If zero is true, the vector is initialized with zeros.
23
23
  # Otherwise, the vector will contain garbage.
24
24
  # You can optionally pass a block, in which case {#map_index!} will be called with it (i.e.: it works like {Array.new}).
25
25
  def initialize(n, zero = false)
26
+ ptr = (zero ? GSLng.backend::gsl_vector_calloc(n) : GSLng.backend::gsl_vector_alloc(n))
27
+ @ptr = FFI::AutoPointer.new(ptr, Vector.method(:release))
26
28
  @size = n
27
- @ptr = (zero ? GSLng.backend::gsl_vector_calloc(n) : GSLng.backend::gsl_vector_alloc(n))
28
- GSLng.define_finalizer(self, :gsl_vector_free, @ptr)
29
+ @stride = 1
29
30
  if (block_given?) then self.map_index!(Proc.new) end
30
31
  end
31
32
 
32
33
  def initialize_copy(other) # @private
33
- ObjectSpace.undefine_finalizer(self) # TODO: ruby bug?
34
-
34
+ ptr = GSLng.backend::gsl_vector_alloc(other.size)
35
+ @ptr = FFI::AutoPointer.new(ptr, Vector.method(:release))
35
36
  @size = other.size
36
- @ptr = GSLng.backend::gsl_vector_alloc(other.size)
37
- GSLng.define_finalizer(self, :gsl_vector_free, @ptr)
38
-
37
+ @stride = 1
39
38
  GSLng.backend::gsl_vector_memcpy(@ptr, other.ptr)
40
39
  end
41
40
 
41
+ def Vector.release(ptr) # @private
42
+ GSLng.backend.gsl_vector_free(ptr)
43
+ end
44
+
42
45
  # Same as Vector.new(n, true)
43
46
  def Vector.zero(n); Vector.new(n, true) end
44
47
 
@@ -67,20 +70,7 @@ module GSLng
67
70
  end
68
71
  class << self; alias_method :rand, :random end
69
72
 
70
- #--------------------- setting values -------------------------#
71
-
72
- # Set all values to v
73
- def all!(v); GSLng.backend::gsl_vector_set_all(self.ptr, v); return self end
74
- alias_method :set!, :all!
75
- alias_method :fill!, :all!
76
-
77
- # Set all values to zero
78
- def zero!; GSLng.backend::gsl_vector_set_zero(self.ptr); return self end
79
-
80
- # Set all values to zero, except the i-th element, which is set to 1
81
- def basis!(i); GSLng.backend::gsl_vector_set_basis(self.ptr, i); return self end
82
-
83
- #--------------------- operators -------------------------#
73
+ # @group Operators
84
74
 
85
75
  # Add (element-by-element) other to self
86
76
  # @return [Vector] self
@@ -163,7 +153,7 @@ module GSLng
163
153
  # Invert sign on all elements
164
154
  def -@; self.map!(&:-@) end
165
155
 
166
- #--------------------- other math -------------------------#
156
+ # @group Other mathematical operations
167
157
 
168
158
  # Dot product between self and other (uses BLAS's ddot)
169
159
  # @return [Float]
@@ -186,7 +176,7 @@ module GSLng
186
176
  # Optimized version of: self += other * alpha (where alpha is a Numeric). Uses BLAS's daxpy.
187
177
  def mul_add(other, alpha); GSLng.backend::gsl_blas_daxpy(alpha, other.ptr, self.ptr); return self end
188
178
 
189
- #--------------------- misc -------------------------#
179
+ # @group Miscelaneous methods
190
180
 
191
181
  # Reverse the order of elements
192
182
  def reverse!; GSLng.backend::gsl_vector_reverse(self.ptr); return self end
@@ -223,14 +213,14 @@ module GSLng
223
213
  return delta
224
214
  end
225
215
 
226
- #--------------------- set/get -------------------------#
216
+ # @group Setting/getting values
227
217
 
228
218
  # Access the i-th element.
229
219
  # If _index_ is negative, it counts from the end (-1 is the last element).
230
220
  # @raise [RuntimeError] if out-of-bounds
231
- # @todo support ranges
221
+ # @todo support ranges
232
222
  def [](index)
233
- GSLng.backend::gsl_vector_get(self.ptr, (index < 0 ? @size + index : index))
223
+ GSLng.backend.gsl_vector_get_operator(self.ptr.to_i, index)
234
224
  end
235
225
 
236
226
  # Set the i-th element.
@@ -241,6 +231,8 @@ module GSLng
241
231
  GSLng.backend::gsl_vector_set(self.ptr, (index < 0 ? @size + index : index), value.to_f)
242
232
  end
243
233
 
234
+ # @group Views
235
+
244
236
  # Create a {Vector::View} from this Vector.
245
237
  # If _size_ is nil, it is computed automatically from _offset_ and _stride_
246
238
  def view(offset = 0, size = nil, stride = 1)
@@ -254,14 +246,25 @@ module GSLng
254
246
 
255
247
  if (stride == 1) then ptr = GSLng.backend::gsl_vector_subvector2(self.ptr, offset, size)
256
248
  else ptr = GSLng.backend::gsl_vector_subvector_with_stride2(self.ptr, offset, stride, size) end
257
- View.new(ptr, self, offset, size)
249
+ View.new(ptr, self, size, stride)
258
250
  end
259
251
  alias_method :subvector_view, :view
260
252
 
261
253
  # Shorthand for #subvector_view(..).to_vector.
262
254
  def subvector(*args); subvector_view(*args).to_vector end
263
255
 
264
- #------------ utility methods for 2D,3D and 4D vectors -----------#
256
+ # Set all values to v
257
+ def all!(v); GSLng.backend::gsl_vector_set_all(self.ptr, v); return self end
258
+ alias_method :set!, :all!
259
+ alias_method :fill!, :all!
260
+
261
+ # Set all values to zero
262
+ def zero!; GSLng.backend::gsl_vector_set_zero(self.ptr); return self end
263
+
264
+ # Set all values to zero, except the i-th element, which is set to 1
265
+ def basis!(i); GSLng.backend::gsl_vector_set_basis(self.ptr, i); return self end
266
+
267
+ # @group 2D/3D/4D utility vectors
265
268
 
266
269
  # Same as Vector#[0]
267
270
  def x; GSLng.backend::gsl_vector_get(self.ptr, 0) end
@@ -281,7 +284,7 @@ module GSLng
281
284
  # Same as Vector#[3]=
282
285
  def w=(v); GSLng.backend::gsl_vector_set(self.ptr, 3, v.to_f) end
283
286
 
284
- #--------------------- predicate methods -------------------------#
287
+ # @group Predicate methods
285
288
 
286
289
  # if all elements are zero
287
290
  def zero?; GSLng.backend::gsl_vector_isnull(self.ptr) == 1 ? true : false end
@@ -307,7 +310,7 @@ module GSLng
307
310
  # If each element of self is less-or-equal than other's elements
308
311
  def >=(other); (self - other).nonnegative? end
309
312
 
310
- #--------------------- min/max -------------------------#
313
+ # @group Minimum/Maximum
311
314
 
312
315
  # Return maximum element of vector
313
316
  def max; GSLng.backend::gsl_vector_max(self.ptr) end
@@ -337,10 +340,81 @@ module GSLng
337
340
 
338
341
  # Same as {#max}, but returns the index to the element
339
342
  def max_index; GSLng.backend::gsl_vector_max_index(self.ptr) end
343
+
344
+ # @group Statistics
345
+
346
+ # Compute the mean of the vector
347
+ def mean; GSLng.backend.gsl_stats_mean(self.as_array, self.stride, self.size) end
348
+
349
+ # Compute the variance of the vector
350
+ # @param [Float] mean Optionally supply the mean if you already computed it previously with {self#mean}
351
+ # @param [Boolean] fixed_mean If true, the passed mean is taken to be known a priori (see GSL documentation)
352
+ def variance(mean = nil, fixed_mean = false)
353
+ if (mean.nil?) then GSLng.backend.gsl_stats_variance(self.as_array, self.stride, self.size)
354
+ else
355
+ if (fixed_mean) then GSLng.backend.gsl_stats_variance_with_fixed_mean(self.as_array, self.stride, self.size, mean)
356
+ else GSLng.backend.gsl_stats_variance_m(self.as_array, self.stride, self.size, mean) end
357
+ end
358
+ end
359
+
360
+ # Compute the standard deviation of the vector
361
+ # @see #variance
362
+ def standard_deviation(mean = nil, fixed_mean = false)
363
+ if (mean.nil?) then GSLng.backend.gsl_stats_sd(self.as_array, self.stride, self.size)
364
+ else
365
+ if (fixed_mean) then GSLng.backend.gsl_stats_sd_with_fixed_mean(self.as_array, self.stride, self.size, mean)
366
+ else GSLng.backend.gsl_stats_sd_m(self.as_array, self.stride, self.size, mean) end
367
+ end
368
+ end
369
+
370
+ # Compute the total sum of squares of the vector
371
+ # @see #variance
372
+ def total_sum_squares(mean = nil)
373
+ if (mean.nil?) then GSLng.backend.gsl_stats_tss(self.as_array, self.stride, self.size)
374
+ else GSLng.backend.gsl_stats_tss_m(self.as_array, self.stride, self.size, mean) end
375
+ end
376
+
377
+ # Compute the absolute deviation of the vector
378
+ # @see #variance
379
+ def absolute_deviation(mean = nil)
380
+ if (mean.nil?) then GSLng.backend.gsl_stats_absdev(self.as_array, self.stride, self.size)
381
+ else GSLng.backend.gsl_stats_absdev_m(self.as_array, self.stride, self.size, mean) end
382
+ end
383
+
384
+ # Compute the skew of the vector. You can optionally provide the mean *and* the standard deviation if you already computed them
385
+ def skew(mean = nil, sd = nil)
386
+ if (mean.nil? || sd.nil?) then GSLng.backend.gsl_stats_skew(self.as_array, self.stride, self.size)
387
+ else GSLng.backend.gsl_stats_skew_sd_m(self.as_array, self.stride, self.size, mean, sd) end
388
+ end
389
+
390
+ # Compute the kurtosis of the vector
391
+ # @see #skew
392
+ def kurtosis(mean = nil, sd = nil)
393
+ if (mean.nil? || sd.nil?) then GSLng.backend.gsl_stats_kurtosis(self.as_array, self.stride, self.size)
394
+ else GSLng.backend.gsl_stats_kurtosis_sd_m(self.as_array, self.stride, self.size, mean, sd) end
395
+ end
396
+
397
+ # Compute the autocorrelation of the vector
398
+ # @see #variance
399
+ def autocorrelation(mean = nil)
400
+ if (mean.nil?) then GSLng.backend.gsl_stats_lag1_autocorrelation(self.as_array, self.stride, self.size)
401
+ else GSLng.backend.gsl_stats_lag1_autocorrelation(self.as_array, self.stride, self.size, mean) end
402
+ end
403
+
404
+ # Compute the covariance between self and other. You can optionally pass the mean of both vectors if you already computed them
405
+ # @see #variance
406
+ def covariance(other, mean1 = nil, mean2 = nil)
407
+ if (mean1.nil? || mean2.nil?) then GSLng.backend.gsl_stats_covariance(self.as_array, self.stride, other.as_array, other.stride, self.size)
408
+ else GSLng.backend.gsl_stats_covariance(self.as_array, self.stride, other.as_array, other.stride, self.size, mean1, mean2) end
409
+ end
340
410
 
341
- #--------------------- block handling -------------------------#
411
+ # Compute the correlation between self and other
412
+ def correlation(other)
413
+ GSLng.backend.gsl_stats_correlation(self.as_array, self.stride, other.as_array, other.stride, self.size)
414
+ end
415
+
416
+ # @group High-order methods
342
417
 
343
- # Same as {#each}, but faster. The catch is that this method returns nothing.
344
418
  # @yield [elem]
345
419
  def each(block = Proc.new)
346
420
  GSLng.backend::gsl_vector_each(self.ptr.to_i, &block)
@@ -352,7 +426,7 @@ module GSLng
352
426
  GSLng.backend::gsl_vector_each_with_index(self.ptr.to_i, &block)
353
427
  end
354
428
 
355
- # Efficient {#map!} implementation.
429
+ # @see #map
356
430
  def map!(block = Proc.new); GSLng.backend::gsl_vector_map!(self.ptr.to_i, &block); return self end
357
431
 
358
432
  # Similar to {#map!}, but passes the index to the element instead.
@@ -360,17 +434,23 @@ module GSLng
360
434
  def map_index!(block = Proc.new); GSLng.backend::gsl_vector_map_index!(self.ptr.to_i, &block); return self end
361
435
 
362
436
  # @return [Vector]
363
- # @see map_index!
437
+ # @see #map_index!
364
438
  # @yield [i]
365
439
  def map_index(block = Proc.new); self.dup.map_index!(block) end
366
440
 
367
- alias_method :map_array, :map
441
+ alias_method :map_old, :map
442
+
443
+ # Acts like the normal 'map' method from Enumerator
444
+ # @return [Array]
445
+ # @see #map
446
+ # @yield [i]
447
+ def map_array(block = Proc.new); self.map_old(&block); end
368
448
 
369
449
  # @return [Vector]
370
450
  # @yield [elem]
371
451
  def map(block = Proc.new); self.dup.map!(block) end
372
452
 
373
- #--------------------- conversions -------------------------#
453
+ # @group Type conversions
374
454
 
375
455
  # @see Array#join
376
456
  # @return [String]
@@ -411,6 +491,10 @@ module GSLng
411
491
  def to_a
412
492
  GSLng.backend.gsl_vector_to_a(self.ptr.to_i)
413
493
  end
494
+
495
+ def as_array # @private
496
+ GSLng.backend.gsl_vector_as_array(self.ptr)
497
+ end
414
498
 
415
499
  # Create a row matrix from this vector
416
500
  # @return [Matrix]
@@ -430,7 +514,7 @@ module GSLng
430
514
  end
431
515
  alias_method :to_column, :transpose
432
516
 
433
- #--------------------- equality -------------------------#
517
+ # @group Equality test
434
518
 
435
519
  # Element-by-element comparison. Admits comparing to Array.
436
520
  def ==(other)
@@ -10,9 +10,13 @@ module GSLng
10
10
  # @return [Vector,Matrix] The owner of the data this view accesses
11
11
  attr_reader :owner
12
12
 
13
- def initialize(ptr, owner, offset, size) # @private
14
- @owner,@size,@ptr = owner,size,ptr
15
- GSLng.define_finalizer(self, :gsl_vector_free, @ptr)
13
+ def initialize(ptr, owner, size, stride = 1) # @private
14
+ @owner,@size,@stride = owner,size,stride
15
+ @ptr = FFI::AutoPointer.new(ptr, View.method(:release))
16
+ end
17
+
18
+ def View.release(ptr)
19
+ GSLng.backend.gsl_vector_free(ptr)
16
20
  end
17
21
 
18
22
  # Returns a Vector (*NOT* a View) copied from this view. In other words,
data/ruby-gsl-ng.gemspec CHANGED
@@ -2,29 +2,29 @@
2
2
 
3
3
  Gem::Specification.new do |s|
4
4
  s.name = %q{ruby-gsl-ng}
5
- s.version = "0.2.3"
5
+ s.version = "0.2.4"
6
6
 
7
7
  s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version=
8
8
  s.authors = ["v01d"]
9
- s.date = %q{2010-06-09}
10
- s.description = %q{Ruby Object Oriented Graph LIbrary}
9
+ s.date = %q{2010-09-21}
10
+ s.description = %q{Ruby/GSL new-generation wrapper}
11
11
  s.email = %q{}
12
12
  s.extensions = ["ext/extconf.rb"]
13
- s.extra_rdoc_files = ["README.rdoc", "TODO", "ext/extconf.rb", "ext/gslng_extensions.cpp", "lib/gslng.rb", "lib/gslng/backend.rb", "lib/gslng/backend_components/error_handling.rb", "lib/gslng/backend_components/matrix.rb", "lib/gslng/backend_components/rng.rb", "lib/gslng/backend_components/special.rb", "lib/gslng/backend_components/vector.rb", "lib/gslng/finalizer.rb", "lib/gslng/matrix.rb", "lib/gslng/matrix_view.rb", "lib/gslng/rng/gaussian.rb", "lib/gslng/rng/rng.rb", "lib/gslng/rng/uniform.rb", "lib/gslng/special.rb", "lib/gslng/vector.rb", "lib/gslng/vector_view.rb"]
14
- s.files = ["History.txt", "README.rdoc", "Rakefile", "TODO", "ext/extconf.rb", "ext/gslng_extensions.cpp", "lib/gslng.rb", "lib/gslng/backend.rb", "lib/gslng/backend_components/error_handling.rb", "lib/gslng/backend_components/matrix.rb", "lib/gslng/backend_components/rng.rb", "lib/gslng/backend_components/special.rb", "lib/gslng/backend_components/vector.rb", "lib/gslng/finalizer.rb", "lib/gslng/matrix.rb", "lib/gslng/matrix_view.rb", "lib/gslng/rng/gaussian.rb", "lib/gslng/rng/rng.rb", "lib/gslng/rng/uniform.rb", "lib/gslng/special.rb", "lib/gslng/vector.rb", "lib/gslng/vector_view.rb", "ruby-gsl-ng.gemspec", "test/benchmark.rb", "test/benchmark_results", "test/matrix_test.rb", "test/rng_test.rb", "test/test_gsl.rb", "test/test_special.rb", "test/vector_test.rb", "Manifest"]
13
+ s.extra_rdoc_files = ["README.rdoc", "ext/extconf.rb", "ext/gslng_extensions.cpp", "ext/plotting.cpp", "lib/gslng.rb", "lib/gslng/backend.rb", "lib/gslng/backend_components/error_handling.rb", "lib/gslng/backend_components/matrix.rb", "lib/gslng/backend_components/rng.rb", "lib/gslng/backend_components/special.rb", "lib/gslng/backend_components/stats.rb", "lib/gslng/backend_components/vector.rb", "lib/gslng/matrix.rb", "lib/gslng/matrix_view.rb", "lib/gslng/plotter.rb", "lib/gslng/rng/gaussian.rb", "lib/gslng/rng/rng.rb", "lib/gslng/rng/uniform.rb", "lib/gslng/special.rb", "lib/gslng/vector.rb", "lib/gslng/vector_view.rb"]
14
+ s.files = ["History.txt", "README.rdoc", "Rakefile", "ext/extconf.rb", "ext/gslng_extensions.cpp", "ext/plotting.cpp", "lib/gslng.rb", "lib/gslng/backend.rb", "lib/gslng/backend_components/error_handling.rb", "lib/gslng/backend_components/matrix.rb", "lib/gslng/backend_components/rng.rb", "lib/gslng/backend_components/special.rb", "lib/gslng/backend_components/stats.rb", "lib/gslng/backend_components/vector.rb", "lib/gslng/matrix.rb", "lib/gslng/matrix_view.rb", "lib/gslng/plotter.rb", "lib/gslng/rng/gaussian.rb", "lib/gslng/rng/rng.rb", "lib/gslng/rng/uniform.rb", "lib/gslng/special.rb", "lib/gslng/vector.rb", "lib/gslng/vector_view.rb", "ruby-gsl-ng.gemspec", "test/benchmark.rb", "test/benchmark_results", "test/matrix_test.rb", "test/rng_test.rb", "test/test_gsl.rb", "test/test_special.rb", "test/vector_test.rb", "Manifest"]
15
15
  s.homepage = %q{http://github.com/v01d/ruby-gsl-ng}
16
16
  s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Ruby-gsl-ng", "--main", "README.rdoc"]
17
17
  s.require_paths = ["lib", "ext"]
18
18
  s.rubyforge_project = %q{ruby-gsl-ng}
19
- s.rubygems_version = %q{1.3.6}
20
- s.summary = %q{Ruby Object Oriented Graph LIbrary}
19
+ s.rubygems_version = %q{1.3.7}
20
+ s.summary = %q{Ruby/GSL new-generation wrapper}
21
21
  s.test_files = ["test/test_special.rb", "test/vector_test.rb", "test/test_gsl.rb", "test/matrix_test.rb", "test/rng_test.rb"]
22
22
 
23
23
  if s.respond_to? :specification_version then
24
24
  current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
25
25
  s.specification_version = 3
26
26
 
27
- if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
27
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
28
28
  s.add_runtime_dependency(%q<yard>, [">= 0"])
29
29
  s.add_runtime_dependency(%q<ffi>, [">= 0"])
30
30
  else
data/test/benchmark.rb CHANGED
@@ -7,14 +7,27 @@ require 'rbgsl'
7
7
  require 'narray'
8
8
  include Benchmark
9
9
 
10
+ puts '#################################### Vector ####################################'
11
+
12
+ n=500000
13
+ size = 50000
14
+ puts "Vector#[]"
15
+ bmbm do |x|
16
+ v = GSLng::Vector.random(size)
17
+ gv = GSL::Vector.alloc(v.to_a)
18
+ x.report("rb-gsl :") {n.times {i=rand(size); gv[i]}}
19
+ x.report("GSLng :") {n.times {i=rand(size); v[i]}}
20
+ end
21
+ puts
22
+
10
23
  n = 100
11
24
  size = 5000
12
25
  puts "Vector#each - vector of #{size} elements"
13
26
  bmbm do |x|
14
27
  v = GSLng::Vector.zero(size)
15
28
  gv = GSL::Vector.alloc(v.to_a)
16
- x.report("rb-gsl each:") {n.times {s = 0; gv.each do |e| s += e end}}
17
- x.report("each :") {n.times {s = 0; v.each do |e| s += e end}}
29
+ x.report("rb-gsl :") {n.times {s = 0; gv.each do |e| s += e end}}
30
+ x.report("GSLng :") {n.times {s = 0; v.each do |e| s += e end}}
18
31
  end
19
32
  puts
20
33
 
@@ -77,7 +90,7 @@ end
77
90
  puts
78
91
 
79
92
  n=500
80
- size = 5000
93
+ size = 50000
81
94
  puts "Vector::from_array"
82
95
  bmbm do |x|
83
96
  a = Array.new(size) { rand }
@@ -86,15 +99,15 @@ bmbm do |x|
86
99
  end
87
100
  puts
88
101
 
102
+ puts '#################################### Matrix ####################################'
103
+
89
104
  n=500000
90
- size = 5000
91
- puts "Vector#[]"
105
+ size = 50
106
+ puts "Matrix#[] - 50 x 50"
92
107
  bmbm do |x|
93
- v = GSLng::Vector.random(size)
94
- gv = GSL::Vector.alloc(v.to_a)
95
- i = rand(size)
96
- x.report("rb-gsl :") {n.times {gv[i]}}
97
- x.report("GSLng :") {n.times {v[i]}}
108
+ v = GSLng::Matrix.random(size, size)
109
+ gv = GSL::Matrix.alloc(size, size)
110
+ x.report("rb-gsl :") {n.times {i,j=rand(size),rand(size); gv[i,j]}}
111
+ x.report("GSLng :") {n.times {i,j=rand(size),rand(size); v[i,j]}}
98
112
  end
99
- puts
100
-
113
+ puts
data/test/matrix_test.rb CHANGED
@@ -127,4 +127,10 @@ class TestMatrix < Test::Unit::TestCase
127
127
  assert_equal(Matrix[[3],[2]], m.column_view(0))
128
128
  assert_equal(Matrix[3,2,3], m.row_view(0))
129
129
  end
130
+
131
+ def test_map
132
+ m = Matrix[[1,2,3],[2,3,4]]
133
+ assert_equal([['1.0','2.0','3.0'],['2.0','3.0','4.0']], m.map_array {|e| e.to_s})
134
+ assert_equal(Matrix[[2,3,4],[3,4,5]], m.map {|e| e+1})
135
+ end
130
136
  end
data/test/vector_test.rb CHANGED
@@ -35,7 +35,9 @@ class VectorTest < Test::Unit::TestCase
35
35
  end
36
36
 
37
37
  def test_each
38
- assert_equal([1,2,4], Vector[1.1,2.1,3.8].map_array(&:round))
38
+ a = Vector[1.1,2.1,3.8].map_array(&:round)
39
+ assert_kind_of(Array, a)
40
+ assert_equal([1,2,4], a)
39
41
  assert_equal(Vector[1,2,4],Vector[1.1,2.1,3.8].map!(&:round))
40
42
  end
41
43
 
metadata CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
5
5
  segments:
6
6
  - 0
7
7
  - 2
8
- - 3
9
- version: 0.2.3
8
+ - 4
9
+ version: 0.2.4
10
10
  platform: ruby
11
11
  authors:
12
12
  - v01d
@@ -14,13 +14,14 @@ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
16
 
17
- date: 2010-06-09 00:00:00 -03:00
17
+ date: 2010-09-21 00:00:00 -03:00
18
18
  default_executable:
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
21
21
  name: yard
22
22
  prerelease: false
23
23
  requirement: &id001 !ruby/object:Gem::Requirement
24
+ none: false
24
25
  requirements:
25
26
  - - ">="
26
27
  - !ruby/object:Gem::Version
@@ -33,6 +34,7 @@ dependencies:
33
34
  name: ffi
34
35
  prerelease: false
35
36
  requirement: &id002 !ruby/object:Gem::Requirement
37
+ none: false
36
38
  requirements:
37
39
  - - ">="
38
40
  - !ruby/object:Gem::Version
@@ -41,7 +43,7 @@ dependencies:
41
43
  version: "0"
42
44
  type: :runtime
43
45
  version_requirements: *id002
44
- description: Ruby Object Oriented Graph LIbrary
46
+ description: Ruby/GSL new-generation wrapper
45
47
  email: ""
46
48
  executables: []
47
49
 
@@ -49,19 +51,20 @@ extensions:
49
51
  - ext/extconf.rb
50
52
  extra_rdoc_files:
51
53
  - README.rdoc
52
- - TODO
53
54
  - ext/extconf.rb
54
55
  - ext/gslng_extensions.cpp
56
+ - ext/plotting.cpp
55
57
  - lib/gslng.rb
56
58
  - lib/gslng/backend.rb
57
59
  - lib/gslng/backend_components/error_handling.rb
58
60
  - lib/gslng/backend_components/matrix.rb
59
61
  - lib/gslng/backend_components/rng.rb
60
62
  - lib/gslng/backend_components/special.rb
63
+ - lib/gslng/backend_components/stats.rb
61
64
  - lib/gslng/backend_components/vector.rb
62
- - lib/gslng/finalizer.rb
63
65
  - lib/gslng/matrix.rb
64
66
  - lib/gslng/matrix_view.rb
67
+ - lib/gslng/plotter.rb
65
68
  - lib/gslng/rng/gaussian.rb
66
69
  - lib/gslng/rng/rng.rb
67
70
  - lib/gslng/rng/uniform.rb
@@ -72,19 +75,20 @@ files:
72
75
  - History.txt
73
76
  - README.rdoc
74
77
  - Rakefile
75
- - TODO
76
78
  - ext/extconf.rb
77
79
  - ext/gslng_extensions.cpp
80
+ - ext/plotting.cpp
78
81
  - lib/gslng.rb
79
82
  - lib/gslng/backend.rb
80
83
  - lib/gslng/backend_components/error_handling.rb
81
84
  - lib/gslng/backend_components/matrix.rb
82
85
  - lib/gslng/backend_components/rng.rb
83
86
  - lib/gslng/backend_components/special.rb
87
+ - lib/gslng/backend_components/stats.rb
84
88
  - lib/gslng/backend_components/vector.rb
85
- - lib/gslng/finalizer.rb
86
89
  - lib/gslng/matrix.rb
87
90
  - lib/gslng/matrix_view.rb
91
+ - lib/gslng/plotter.rb
88
92
  - lib/gslng/rng/gaussian.rb
89
93
  - lib/gslng/rng/rng.rb
90
94
  - lib/gslng/rng/uniform.rb
@@ -116,6 +120,7 @@ require_paths:
116
120
  - lib
117
121
  - ext
118
122
  required_ruby_version: !ruby/object:Gem::Requirement
123
+ none: false
119
124
  requirements:
120
125
  - - ">="
121
126
  - !ruby/object:Gem::Version
@@ -123,6 +128,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
123
128
  - 0
124
129
  version: "0"
125
130
  required_rubygems_version: !ruby/object:Gem::Requirement
131
+ none: false
126
132
  requirements:
127
133
  - - ">="
128
134
  - !ruby/object:Gem::Version
@@ -133,10 +139,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
133
139
  requirements: []
134
140
 
135
141
  rubyforge_project: ruby-gsl-ng
136
- rubygems_version: 1.3.6
142
+ rubygems_version: 1.3.7
137
143
  signing_key:
138
144
  specification_version: 3
139
- summary: Ruby Object Oriented Graph LIbrary
145
+ summary: Ruby/GSL new-generation wrapper
140
146
  test_files:
141
147
  - test/test_special.rb
142
148
  - test/vector_test.rb
data/TODO DELETED
@@ -1,2 +0,0 @@
1
- Documentation:
2
- - usar cosas de Yard, tipo returns y eso?
@@ -1,9 +0,0 @@
1
- module GSLng
2
- def GSLng.define_finalizer(obj, func, ptr) # @private
3
- ObjectSpace.define_finalizer(obj, self.get_finalizer(func, ptr))
4
- end
5
-
6
- def GSLng.get_finalizer(func, ptr) # @private
7
- lambda {|id| GSLng.backend.send(func, ptr)}
8
- end
9
- end