ruby-gsl-ng 0.2.3 → 0.2.4

Sign up to get free protection for your applications and to get access to all the features.
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