ruby-gsl-ng 0.2.0 → 0.2.2
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 +3 -0
- data/{Manifest.txt → Manifest} +4 -4
- data/{README.txt → README.rdoc} +1 -1
- data/Rakefile +15 -8
- data/TODO +2 -0
- data/ext/gslng_extensions.cpp +14 -0
- data/lib/gslng.rb +0 -3
- data/lib/gslng/backend.rb +2 -1
- data/lib/gslng/backend_components/error_handling.rb +1 -1
- data/lib/gslng/backend_components/matrix.rb +2 -0
- data/lib/gslng/finalizer.rb +1 -1
- data/lib/gslng/matrix.rb +35 -9
- data/lib/gslng/matrix_view.rb +3 -3
- data/lib/gslng/vector.rb +30 -10
- data/lib/gslng/vector_view.rb +9 -12
- data/ruby-gsl-ng.gemspec +38 -0
- data/test/benchmark.rb +4 -0
- data/test/matrix_test.rb +22 -0
- data/test/vector_test.rb +8 -0
- metadata +58 -29
- data/.autotest +0 -23
data/History.txt
CHANGED
data/{Manifest.txt → Manifest}
RENAMED
@@ -1,8 +1,7 @@
|
|
1
|
-
.autotest
|
2
1
|
History.txt
|
3
|
-
|
4
|
-
README.txt
|
2
|
+
README.rdoc
|
5
3
|
Rakefile
|
4
|
+
TODO
|
6
5
|
ext/extconf.rb
|
7
6
|
ext/gslng_extensions.cpp
|
8
7
|
lib/gslng.rb
|
@@ -15,8 +14,9 @@ lib/gslng/matrix.rb
|
|
15
14
|
lib/gslng/matrix_view.rb
|
16
15
|
lib/gslng/vector.rb
|
17
16
|
lib/gslng/vector_view.rb
|
17
|
+
ruby-gsl-ng.gemspec
|
18
18
|
test/benchmark.rb
|
19
19
|
test/matrix_test.rb
|
20
20
|
test/test_gsl.rb
|
21
21
|
test/vector_test.rb
|
22
|
-
|
22
|
+
Manifest
|
data/{README.txt → README.rdoc}
RENAMED
data/Rakefile
CHANGED
@@ -1,13 +1,20 @@
|
|
1
1
|
# -*- ruby -*-
|
2
|
-
|
3
2
|
require 'rubygems'
|
4
|
-
require '
|
3
|
+
require 'rake'
|
4
|
+
require 'echoe'
|
5
|
+
require 'yard'
|
6
|
+
|
7
|
+
Echoe.new('ruby-gsl-ng') do |p|
|
8
|
+
p.author = 'v01d'
|
9
|
+
p.summary = "Ruby Object Oriented Graph LIbrary"
|
10
|
+
p.url = "http://github.com/v01d/roogli"
|
11
|
+
p.version = "0.2.2"
|
12
|
+
p.dependencies = ['yard', 'ffi']
|
13
|
+
# p.eval = proc { s.has_rdoc = 'yard' }
|
14
|
+
end
|
5
15
|
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
extra_deps << [ 'ffi', '>=0' ]
|
10
|
-
ENV['NODOT'] = '1'
|
16
|
+
YARD::Rake::YardocTask.new do |t|
|
17
|
+
t.files = ['lib/**/*.rb'] # optional
|
18
|
+
t.options = ['--verbose','--no-private'] # optional
|
11
19
|
end
|
12
20
|
|
13
|
-
# vim: syntax=ruby
|
data/ext/gslng_extensions.cpp
CHANGED
@@ -102,4 +102,18 @@ extern "C" gsl_matrix* gsl_matrix_submatrix2(gsl_matrix* m_ptr, size_t x, size_t
|
|
102
102
|
gsl_matrix* matrix_view = gsl_matrix_alloc(view.matrix.size1, view.matrix.size2);
|
103
103
|
*matrix_view = view.matrix;
|
104
104
|
return matrix_view;
|
105
|
+
}
|
106
|
+
|
107
|
+
extern "C" gsl_vector* gsl_matrix_row_view(gsl_matrix* m_ptr, size_t row, size_t offset, size_t size) {
|
108
|
+
gsl_vector_view view = gsl_matrix_subrow(m_ptr, row, offset, size);
|
109
|
+
gsl_vector* vector_view = gsl_vector_alloc(view.vector.size);
|
110
|
+
*vector_view = view.vector;
|
111
|
+
return vector_view;
|
112
|
+
}
|
113
|
+
|
114
|
+
extern "C" gsl_vector* gsl_matrix_column_view(gsl_matrix* m_ptr, size_t column, size_t offset, size_t size) {
|
115
|
+
gsl_vector_view view = gsl_matrix_subcolumn(m_ptr, column, offset, size);
|
116
|
+
gsl_vector* vector_view = gsl_vector_alloc(view.vector.size);
|
117
|
+
*vector_view = view.vector;
|
118
|
+
return vector_view;
|
105
119
|
}
|
data/lib/gslng.rb
CHANGED
data/lib/gslng/backend.rb
CHANGED
@@ -5,10 +5,11 @@ module GSLng
|
|
5
5
|
# If ruby had "private" modules I wouldn't have to do this.
|
6
6
|
@backend = Module.new do
|
7
7
|
extend FFI::Library
|
8
|
+
ffi_lib(FFI::CURRENT_PROCESS)
|
8
9
|
end
|
9
10
|
|
10
11
|
# Returns the internal backend module
|
11
|
-
def GSLng.backend
|
12
|
+
def GSLng.backend # @private
|
12
13
|
@backend
|
13
14
|
end
|
14
15
|
end
|
@@ -64,6 +64,8 @@ module GSLng
|
|
64
64
|
|
65
65
|
# views
|
66
66
|
attach_function :gsl_matrix_submatrix2, [ :pointer, :size_t, :size_t, :size_t, :size_t ], :pointer
|
67
|
+
attach_function :gsl_matrix_row_view, [ :pointer, :size_t, :size_t, :size_t ], :pointer
|
68
|
+
attach_function :gsl_matrix_column_view, [ :pointer, :size_t, :size_t, :size_t ], :pointer
|
67
69
|
|
68
70
|
# BLAS interface
|
69
71
|
enum :cblas_transpose_t, [ :no_transpose, 111, :transpose, :conjugate_transpose ]
|
data/lib/gslng/finalizer.rb
CHANGED
data/lib/gslng/matrix.rb
CHANGED
@@ -28,10 +28,10 @@ module GSLng
|
|
28
28
|
GSLng.set_finalizer(self, :gsl_matrix_free, @ptr)
|
29
29
|
|
30
30
|
@m,@n = m,n
|
31
|
-
if (block_given?) then self.map_index!(
|
31
|
+
if (block_given?) then self.map_index!(Proc.new) end
|
32
32
|
end
|
33
33
|
|
34
|
-
def initialize_copy(other)
|
34
|
+
def initialize_copy(other) # @private
|
35
35
|
ObjectSpace.undefine_finalizer(self) # TODO: ruby bug?
|
36
36
|
@ptr = GSLng.backend::gsl_matrix_alloc(other.m, other.n)
|
37
37
|
GSLng.set_finalizer(self, :gsl_matrix_free, @ptr)
|
@@ -145,13 +145,27 @@ module GSLng
|
|
145
145
|
def submatrix(*args); self.submatrix_view(*args).to_matrix end
|
146
146
|
|
147
147
|
# Creates a Matrix::View for the i-th column
|
148
|
-
def column_view(i, offset = 0, size = nil); self.view(offset, i, (size or (
|
148
|
+
def column_view(i, offset = 0, size = nil); self.view(offset, i, (size or (@m - offset)), 1) end
|
149
149
|
|
150
150
|
# Analogous to #submatrix
|
151
151
|
def column(*args); self.column_view(*args).to_matrix end
|
152
152
|
|
153
153
|
# Creates a Matrix::View for the i-th row
|
154
|
-
def row_view(i, offset = 0, size = nil); self.view(i, offset, 1, (size or (
|
154
|
+
def row_view(i, offset = 0, size = nil); self.view(i, offset, 1, (size or (@n - offset))) end
|
155
|
+
|
156
|
+
# Same as #row_view, but returns a Vector::View
|
157
|
+
def row_vecview(i, offset = 0, size = nil)
|
158
|
+
size = (@n - offset) if size.nil?
|
159
|
+
ptr = GSLng.backend.gsl_matrix_row_view(self.ptr, i, offset, size)
|
160
|
+
Vector::View.new(ptr, self, offset, size)
|
161
|
+
end
|
162
|
+
|
163
|
+
# Same as #column_view, but returns a Vector::View
|
164
|
+
def column_vecview(i, offset = 0, size = nil)
|
165
|
+
size = (@m - offset) if size.nil?
|
166
|
+
ptr = GSLng.backend.gsl_matrix_column_view(self.ptr, i, offset, size)
|
167
|
+
Vector::View.new(ptr, self, offset, size)
|
168
|
+
end
|
155
169
|
|
156
170
|
# Analogous to #submatrix
|
157
171
|
def row(*args); self.row_view(*args).to_matrix end
|
@@ -330,18 +344,30 @@ module GSLng
|
|
330
344
|
end
|
331
345
|
|
332
346
|
# Same as #each, but faster. The catch is that this method returns nothing.
|
333
|
-
def fast_each(
|
347
|
+
def fast_each(block = Proc.new) #:yield: elem
|
334
348
|
GSLng.backend::gsl_matrix_each(self.ptr, block)
|
335
349
|
end
|
336
350
|
|
351
|
+
# Yields the block for each row *view* (Matrix::View).
|
352
|
+
def each_row; self.rows.times {|i| yield(row_view(i))} end
|
353
|
+
|
354
|
+
# Same as #each_row, but yields Vector::View's
|
355
|
+
def each_vec_row; self.rows.times {|i| yield(row_vecview(i))} end
|
356
|
+
|
357
|
+
# Same as #each_column, but yields Vector::View's
|
358
|
+
def each_vec_column; self.columns.times {|i| yield(column_vecview(i))} end
|
359
|
+
|
360
|
+
# Yields the block for each column *view* (Matrix::View).
|
361
|
+
def each_column; self.columns.times {|i| yield(column_view(i))} end
|
362
|
+
|
337
363
|
# Efficient map! implementation
|
338
|
-
def map!(
|
364
|
+
def map!(block = Proc.new); GSLng.backend::gsl_matrix_map(@ptr, block); return self end
|
339
365
|
|
340
366
|
# Alternate version of #map!, in this case the block receives the index as a parameter.
|
341
|
-
def map_index!(
|
367
|
+
def map_index!(block = Proc.new); GSLng.backend::gsl_matrix_map_index(@ptr, block); return self end
|
342
368
|
|
343
369
|
# See #map!. Returns a Matrix.
|
344
|
-
def map(
|
370
|
+
def map(block = Proc.new); self.dup.map!(block) end
|
345
371
|
|
346
372
|
#--------------------- conversions -------------------------#
|
347
373
|
|
@@ -368,7 +394,7 @@ module GSLng
|
|
368
394
|
return s
|
369
395
|
end
|
370
396
|
|
371
|
-
def inspect
|
397
|
+
def inspect # @private
|
372
398
|
"#{self}:Matrix"
|
373
399
|
end
|
374
400
|
|
data/lib/gslng/matrix_view.rb
CHANGED
@@ -10,7 +10,7 @@ module GSLng
|
|
10
10
|
attr_reader :owner # The Matrix owning the data this View uses
|
11
11
|
|
12
12
|
# Create a MatrixView of the sub-matrix starting at (x,y), of size (m,n)
|
13
|
-
def initialize(owner, x, y, m, n)
|
13
|
+
def initialize(owner, x, y, m, n) # @private
|
14
14
|
@owner = owner
|
15
15
|
@m,@n = m,n
|
16
16
|
@ptr = GSLng.backend::gsl_matrix_submatrix2(owner.ptr, x, y, m, n)
|
@@ -27,11 +27,11 @@ module GSLng
|
|
27
27
|
alias_method :clone, :dup
|
28
28
|
alias_method :to_matrix, :dup
|
29
29
|
|
30
|
-
def view
|
30
|
+
def view # @private
|
31
31
|
raise "Can't create a View from a View"
|
32
32
|
end
|
33
33
|
|
34
|
-
def inspect
|
34
|
+
def inspect # @private
|
35
35
|
"#{self}:MatrixView"
|
36
36
|
end
|
37
37
|
end
|
data/lib/gslng/vector.rb
CHANGED
@@ -14,7 +14,7 @@ module GSLng
|
|
14
14
|
class Vector
|
15
15
|
include Enumerable
|
16
16
|
|
17
|
-
attr_reader :ptr #
|
17
|
+
attr_reader :ptr # @private
|
18
18
|
attr_reader :size # Vector size
|
19
19
|
|
20
20
|
#--------------------- constructors -------------------------#
|
@@ -26,10 +26,10 @@ module GSLng
|
|
26
26
|
@size = n
|
27
27
|
@ptr = (zero ? GSLng.backend::gsl_vector_calloc(n) : GSLng.backend::gsl_vector_alloc(n))
|
28
28
|
GSLng.set_finalizer(self, :gsl_vector_free, @ptr)
|
29
|
-
if (block_given?) then self.map_index!(
|
29
|
+
if (block_given?) then self.map_index!(Proc.new) end
|
30
30
|
end
|
31
31
|
|
32
|
-
def initialize_copy(other)
|
32
|
+
def initialize_copy(other) # @private
|
33
33
|
ObjectSpace.undefine_finalizer(self) # TODO: ruby bug?
|
34
34
|
|
35
35
|
@size = other.size
|
@@ -149,6 +149,9 @@ module GSLng
|
|
149
149
|
# Element-by-element division
|
150
150
|
def /(other); self.dup.div!(other) end
|
151
151
|
|
152
|
+
# Invert sign on all elements
|
153
|
+
def -@; self.map!(&:-@) end
|
154
|
+
|
152
155
|
#--------------------- other math -------------------------#
|
153
156
|
|
154
157
|
# Dot product between self and other (uses BLAS's ddot)
|
@@ -209,13 +212,27 @@ module GSLng
|
|
209
212
|
k,m = size.divmod(stride)
|
210
213
|
size = k + (m == 0 ? 0 : 1)
|
211
214
|
end
|
212
|
-
|
215
|
+
|
216
|
+
if (stride == 1) then ptr = GSLng.backend::gsl_vector_subvector2(self.ptr, offset, size)
|
217
|
+
else ptr = GSLng.backend::gsl_vector_subvector_with_stride2(self.ptr, offset, stride, size) end
|
218
|
+
View.new(ptr, self, offset, size)
|
213
219
|
end
|
214
220
|
alias_method :subvector_view, :view
|
215
221
|
|
216
222
|
# Shorthand for #subvector_view(..).to_vector.
|
217
223
|
def subvector(*args); subvector_view(*args).to_vector end
|
218
224
|
|
225
|
+
#------------ utility methods for 2D,3D and 4D vectors -----------#
|
226
|
+
def x; GSLng.backend::gsl_vector_get(self.ptr, 0) end
|
227
|
+
def y; GSLng.backend::gsl_vector_get(self.ptr, 1) end
|
228
|
+
def z; GSLng.backend::gsl_vector_get(self.ptr, 2) end
|
229
|
+
def w; GSLng.backend::gsl_vector_get(self.ptr, 3) end
|
230
|
+
|
231
|
+
def x=(v); GSLng.backend::gsl_vector_set(self.ptr, 0, v.to_f) end
|
232
|
+
def y=(v); GSLng.backend::gsl_vector_set(self.ptr, 1, v.to_f) end
|
233
|
+
def z=(v); GSLng.backend::gsl_vector_set(self.ptr, 2, v.to_f) end
|
234
|
+
def w=(v); GSLng.backend::gsl_vector_set(self.ptr, 3, v.to_f) end
|
235
|
+
|
219
236
|
#--------------------- predicate methods -------------------------#
|
220
237
|
|
221
238
|
# if all elements are zero
|
@@ -269,22 +286,25 @@ module GSLng
|
|
269
286
|
end
|
270
287
|
|
271
288
|
# Same as #each, but faster. The catch is that this method returns nothing.
|
272
|
-
def fast_each(
|
289
|
+
def fast_each(block = Proc.new) #:yield: obj
|
273
290
|
GSLng.backend::gsl_vector_each(self.ptr, block)
|
274
291
|
end
|
275
292
|
|
276
|
-
def fast_each_with_index(
|
293
|
+
def fast_each_with_index(block = Proc.new) #:yield: obj,i
|
277
294
|
GSLng.backend::gsl_vector_each_with_index(self.ptr, block)
|
278
295
|
end
|
279
296
|
|
280
297
|
# Efficient map! implementation
|
281
|
-
def map!(
|
298
|
+
def map!(block = Proc.new); GSLng.backend::gsl_vector_map(self.ptr, block); return self end
|
282
299
|
|
283
300
|
# Alternate version of #map!, in this case the block receives the index as a parameter.
|
284
|
-
def map_index!(
|
301
|
+
def map_index!(block = Proc.new); GSLng.backend::gsl_vector_map_index(self.ptr, block); return self end
|
285
302
|
|
286
303
|
# See #map!. Returns a Vector.
|
287
|
-
def map(
|
304
|
+
def map(block = Proc.new); self.dup.map!(block) end
|
305
|
+
|
306
|
+
# Same as #map but returns an Array
|
307
|
+
def map_array(block = Proc.new) ary = []; self.fast_each {|elem| ary << block.call(elem)}; return ary end
|
288
308
|
|
289
309
|
#--------------------- conversions -------------------------#
|
290
310
|
|
@@ -314,7 +334,7 @@ module GSLng
|
|
314
334
|
"[" + self.join(', ') + "]"
|
315
335
|
end
|
316
336
|
|
317
|
-
def inspect
|
337
|
+
def inspect # @private
|
318
338
|
"#{self}:Vector"
|
319
339
|
end
|
320
340
|
|
data/lib/gslng/vector_view.rb
CHANGED
@@ -2,21 +2,18 @@ module GSLng
|
|
2
2
|
class Vector
|
3
3
|
# A View of a Vector.
|
4
4
|
#
|
5
|
-
# Views reference an existing Vector and can be used to access parts of it without
|
6
|
-
# it entirely. You can treat a View just like a Vector.
|
7
|
-
# But note that modifying elements of a View will modify the elements of the original
|
5
|
+
# Views reference an existing Vector (or a row/column from a Matrix) and can be used to access parts of it without
|
6
|
+
# having to copy it entirely. You can treat a View just like a Vector.
|
7
|
+
# But note that modifying elements of a View will modify the elements of the original Vector/Matrix.
|
8
8
|
#
|
9
9
|
class View < Vector
|
10
10
|
attr_reader :owner # The Vector owning the data this View uses
|
11
|
-
|
12
|
-
def initialize(owner, offset, size
|
13
|
-
@owner = owner
|
14
|
-
@size = size
|
15
|
-
if (stride == 1) then @ptr = GSLng.backend::gsl_vector_subvector2(owner.ptr, offset, size)
|
16
|
-
else @ptr = GSLng.backend::gsl_vector_subvector_with_stride2(owner.ptr, offset, stride, size) end
|
11
|
+
|
12
|
+
def initialize(ptr, owner, offset, size) # @private
|
13
|
+
@owner,@size,@ptr = owner,size,ptr
|
17
14
|
GSLng.set_finalizer(self, :gsl_vector_free, @ptr)
|
18
15
|
end
|
19
|
-
|
16
|
+
|
20
17
|
# Returns a Vector (*NOT* a View) copied from this view. In other words,
|
21
18
|
# you'll get a Vector which you can modify without modifying #owner elements
|
22
19
|
def dup
|
@@ -27,11 +24,11 @@ module GSLng
|
|
27
24
|
alias_method :clone, :dup
|
28
25
|
alias_method :to_vector, :dup
|
29
26
|
|
30
|
-
def view
|
27
|
+
def view # @private
|
31
28
|
raise "Can't create a View from a View"
|
32
29
|
end
|
33
30
|
|
34
|
-
def inspect
|
31
|
+
def inspect # @private
|
35
32
|
"#{self}:VectorView"
|
36
33
|
end
|
37
34
|
end
|
data/ruby-gsl-ng.gemspec
ADDED
@@ -0,0 +1,38 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
Gem::Specification.new do |s|
|
4
|
+
s.name = %q{ruby-gsl-ng}
|
5
|
+
s.version = "0.2.2"
|
6
|
+
|
7
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version=
|
8
|
+
s.authors = ["v01d"]
|
9
|
+
s.date = %q{2010-03-06}
|
10
|
+
s.description = %q{Ruby Object Oriented Graph LIbrary}
|
11
|
+
s.email = %q{}
|
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/vector.rb", "lib/gslng/finalizer.rb", "lib/gslng/matrix.rb", "lib/gslng/matrix_view.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/vector.rb", "lib/gslng/finalizer.rb", "lib/gslng/matrix.rb", "lib/gslng/matrix_view.rb", "lib/gslng/vector.rb", "lib/gslng/vector_view.rb", "ruby-gsl-ng.gemspec", "test/benchmark.rb", "test/matrix_test.rb", "test/test_gsl.rb", "test/vector_test.rb", "Manifest"]
|
15
|
+
s.homepage = %q{http://github.com/v01d/roogli}
|
16
|
+
s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Ruby-gsl-ng", "--main", "README.rdoc"]
|
17
|
+
s.require_paths = ["lib", "ext"]
|
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}
|
21
|
+
s.test_files = ["test/vector_test.rb", "test/test_gsl.rb", "test/matrix_test.rb"]
|
22
|
+
|
23
|
+
if s.respond_to? :specification_version then
|
24
|
+
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
25
|
+
s.specification_version = 3
|
26
|
+
|
27
|
+
if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
|
28
|
+
s.add_runtime_dependency(%q<yard>, [">= 0"])
|
29
|
+
s.add_runtime_dependency(%q<ffi>, [">= 0"])
|
30
|
+
else
|
31
|
+
s.add_dependency(%q<yard>, [">= 0"])
|
32
|
+
s.add_dependency(%q<ffi>, [">= 0"])
|
33
|
+
end
|
34
|
+
else
|
35
|
+
s.add_dependency(%q<yard>, [">= 0"])
|
36
|
+
s.add_dependency(%q<ffi>, [">= 0"])
|
37
|
+
end
|
38
|
+
end
|
data/test/benchmark.rb
CHANGED
@@ -16,6 +16,7 @@ bm do |x|
|
|
16
16
|
x.report("each :") {n.times {s = 0; v.each do |e| s += e end}}
|
17
17
|
x.report("fast_each :") {n.times {s = 0; v.fast_each do |e| s += e end}}
|
18
18
|
end
|
19
|
+
puts
|
19
20
|
|
20
21
|
n = 500
|
21
22
|
size = 50000
|
@@ -27,6 +28,7 @@ bm do |x|
|
|
27
28
|
x.report("rb-gsl :") {n.times {gv.dnrm2}}
|
28
29
|
x.report("GSLng :") {n.times {v.norm}}
|
29
30
|
end
|
31
|
+
puts
|
30
32
|
|
31
33
|
n=5000
|
32
34
|
size = 5000
|
@@ -37,6 +39,7 @@ bm do |x|
|
|
37
39
|
x.report("rb-gsl :") {n.times {gv.mul!(gv2)}}
|
38
40
|
x.report("GSLng :") {n.times {v.mul!(v2)}}
|
39
41
|
end
|
42
|
+
puts
|
40
43
|
|
41
44
|
n=500
|
42
45
|
size = 5000
|
@@ -47,3 +50,4 @@ bm do |x|
|
|
47
50
|
x.report("rb-gsl :") {n.times {v.sort!}}
|
48
51
|
x.report("GSLng :") {n.times {gv.sort!}}
|
49
52
|
end
|
53
|
+
puts
|
data/test/matrix_test.rb
CHANGED
@@ -41,6 +41,28 @@ class TestMatrix < Test::Unit::TestCase
|
|
41
41
|
assert_equal(2, m[1,0])
|
42
42
|
end
|
43
43
|
|
44
|
+
def test_each
|
45
|
+
m = Matrix[[1,2,3],[3,4,5]]
|
46
|
+
a = []
|
47
|
+
m.each {|e| a << e}
|
48
|
+
assert_equal([1,2,3,3,4,5], a)
|
49
|
+
a = []
|
50
|
+
m.each {|e| a << e}
|
51
|
+
assert_equal([1,2,3,3,4,5], a)
|
52
|
+
a = []
|
53
|
+
m.each_row {|r| r.each {|e| a << e}}
|
54
|
+
assert_equal([1,2,3,3,4,5], a)
|
55
|
+
a = []
|
56
|
+
m.each_column {|c| c.each {|e| a << e}}
|
57
|
+
assert_equal([1,3,2,4,3,5], a)
|
58
|
+
a = []
|
59
|
+
m.each_vec_row {|r| r.each {|e| a << e}}
|
60
|
+
assert_equal([1,2,3,3,4,5], a)
|
61
|
+
a = []
|
62
|
+
m.each_vec_column {|c| c.each {|e| a << e}}
|
63
|
+
assert_equal([1,3,2,4,3,5], a)
|
64
|
+
end
|
65
|
+
|
44
66
|
def test_complex_get
|
45
67
|
m = Matrix[[1,2,3],[2,3,4]]
|
46
68
|
assert_equal(m, m[:*,:*])
|
data/test/vector_test.rb
CHANGED
@@ -21,6 +21,7 @@ class VectorTest < Test::Unit::TestCase
|
|
21
21
|
assert_equal("[0.0]", Vector.zero(1).to_s)
|
22
22
|
assert_equal("[0.0, 0.0, 0.0]", Vector.zero(3).to_s)
|
23
23
|
assert_equal("[0.0, 1.0, 2.0]", Vector.new(3) {|i| i}.to_s)
|
24
|
+
assert_equal("[1.0, 2.0, 3.0]", Vector.new(3) {|i| i+1}.to_s)
|
24
25
|
assert_equal("[1.0, 2.0, 3.0]", Vector[1,2,3].to_s)
|
25
26
|
assert_equal("1.0 2.0 3.0", Vector[1,2,3].join(' '))
|
26
27
|
end
|
@@ -33,6 +34,13 @@ class VectorTest < Test::Unit::TestCase
|
|
33
34
|
assert_not_equal(Vector.zero(4), Vector.zero(3))
|
34
35
|
end
|
35
36
|
|
37
|
+
def test_each
|
38
|
+
assert_equal([1,2,4], Vector[1.1,2.1,3.8].map_array(&:round))
|
39
|
+
assert_raise {Vector[1,2,3].fast_each}
|
40
|
+
assert_raise {Vector[1,2,3].each}
|
41
|
+
assert_equal(Vector[1,2,4],Vector[1.1,2.1,3.8].map!(&:round))
|
42
|
+
end
|
43
|
+
|
36
44
|
def test_copies
|
37
45
|
v1 = Vector[1,2,3]
|
38
46
|
v2 = Vector[2,3,4]
|
metadata
CHANGED
@@ -1,7 +1,12 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ruby-gsl-ng
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
|
4
|
+
prerelease: false
|
5
|
+
segments:
|
6
|
+
- 0
|
7
|
+
- 2
|
8
|
+
- 2
|
9
|
+
version: 0.2.2
|
5
10
|
platform: ruby
|
6
11
|
authors:
|
7
12
|
- v01d
|
@@ -9,46 +14,59 @@ autorequire:
|
|
9
14
|
bindir: bin
|
10
15
|
cert_chain: []
|
11
16
|
|
12
|
-
date: 2010-
|
17
|
+
date: 2010-03-06 00:00:00 -03:00
|
13
18
|
default_executable:
|
14
19
|
dependencies:
|
15
20
|
- !ruby/object:Gem::Dependency
|
16
|
-
name:
|
17
|
-
|
18
|
-
|
19
|
-
version_requirements: !ruby/object:Gem::Requirement
|
21
|
+
name: yard
|
22
|
+
prerelease: false
|
23
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
20
24
|
requirements:
|
21
25
|
- - ">="
|
22
26
|
- !ruby/object:Gem::Version
|
27
|
+
segments:
|
28
|
+
- 0
|
23
29
|
version: "0"
|
24
|
-
|
30
|
+
type: :runtime
|
31
|
+
version_requirements: *id001
|
25
32
|
- !ruby/object:Gem::Dependency
|
26
|
-
name:
|
27
|
-
|
28
|
-
|
29
|
-
version_requirements: !ruby/object:Gem::Requirement
|
33
|
+
name: ffi
|
34
|
+
prerelease: false
|
35
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
30
36
|
requirements:
|
31
37
|
- - ">="
|
32
38
|
- !ruby/object:Gem::Version
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
39
|
+
segments:
|
40
|
+
- 0
|
41
|
+
version: "0"
|
42
|
+
type: :runtime
|
43
|
+
version_requirements: *id002
|
44
|
+
description: Ruby Object Oriented Graph LIbrary
|
45
|
+
email: ""
|
38
46
|
executables: []
|
39
47
|
|
40
48
|
extensions:
|
41
49
|
- ext/extconf.rb
|
42
50
|
extra_rdoc_files:
|
43
|
-
-
|
44
|
-
-
|
45
|
-
-
|
51
|
+
- README.rdoc
|
52
|
+
- TODO
|
53
|
+
- ext/extconf.rb
|
54
|
+
- ext/gslng_extensions.cpp
|
55
|
+
- lib/gslng.rb
|
56
|
+
- lib/gslng/backend.rb
|
57
|
+
- lib/gslng/backend_components/error_handling.rb
|
58
|
+
- lib/gslng/backend_components/matrix.rb
|
59
|
+
- lib/gslng/backend_components/vector.rb
|
60
|
+
- lib/gslng/finalizer.rb
|
61
|
+
- lib/gslng/matrix.rb
|
62
|
+
- lib/gslng/matrix_view.rb
|
63
|
+
- lib/gslng/vector.rb
|
64
|
+
- lib/gslng/vector_view.rb
|
46
65
|
files:
|
47
|
-
- .autotest
|
48
66
|
- History.txt
|
49
|
-
-
|
50
|
-
- README.txt
|
67
|
+
- README.rdoc
|
51
68
|
- Rakefile
|
69
|
+
- TODO
|
52
70
|
- ext/extconf.rb
|
53
71
|
- ext/gslng_extensions.cpp
|
54
72
|
- lib/gslng.rb
|
@@ -61,18 +79,24 @@ files:
|
|
61
79
|
- lib/gslng/matrix_view.rb
|
62
80
|
- lib/gslng/vector.rb
|
63
81
|
- lib/gslng/vector_view.rb
|
82
|
+
- ruby-gsl-ng.gemspec
|
64
83
|
- test/benchmark.rb
|
65
84
|
- test/matrix_test.rb
|
66
85
|
- test/test_gsl.rb
|
67
86
|
- test/vector_test.rb
|
87
|
+
- Manifest
|
68
88
|
has_rdoc: true
|
69
|
-
homepage: http://
|
89
|
+
homepage: http://github.com/v01d/roogli
|
70
90
|
licenses: []
|
71
91
|
|
72
92
|
post_install_message:
|
73
93
|
rdoc_options:
|
94
|
+
- --line-numbers
|
95
|
+
- --inline-source
|
96
|
+
- --title
|
97
|
+
- Ruby-gsl-ng
|
74
98
|
- --main
|
75
|
-
- README.
|
99
|
+
- README.rdoc
|
76
100
|
require_paths:
|
77
101
|
- lib
|
78
102
|
- ext
|
@@ -80,20 +104,25 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
80
104
|
requirements:
|
81
105
|
- - ">="
|
82
106
|
- !ruby/object:Gem::Version
|
107
|
+
segments:
|
108
|
+
- 0
|
83
109
|
version: "0"
|
84
|
-
version:
|
85
110
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
86
111
|
requirements:
|
87
112
|
- - ">="
|
88
113
|
- !ruby/object:Gem::Version
|
89
|
-
|
90
|
-
|
114
|
+
segments:
|
115
|
+
- 1
|
116
|
+
- 2
|
117
|
+
version: "1.2"
|
91
118
|
requirements: []
|
92
119
|
|
93
120
|
rubyforge_project: ruby-gsl-ng
|
94
|
-
rubygems_version: 1.3.
|
121
|
+
rubygems_version: 1.3.6
|
95
122
|
signing_key:
|
96
123
|
specification_version: 3
|
97
|
-
summary:
|
124
|
+
summary: Ruby Object Oriented Graph LIbrary
|
98
125
|
test_files:
|
126
|
+
- test/vector_test.rb
|
99
127
|
- test/test_gsl.rb
|
128
|
+
- test/matrix_test.rb
|
data/.autotest
DELETED
@@ -1,23 +0,0 @@
|
|
1
|
-
# -*- ruby -*-
|
2
|
-
|
3
|
-
require 'autotest/restart'
|
4
|
-
|
5
|
-
# Autotest.add_hook :initialize do |at|
|
6
|
-
# at.extra_files << "../some/external/dependency.rb"
|
7
|
-
#
|
8
|
-
# at.libs << ":../some/external"
|
9
|
-
#
|
10
|
-
# at.add_exception 'vendor'
|
11
|
-
#
|
12
|
-
# at.add_mapping(/dependency.rb/) do |f, _|
|
13
|
-
# at.files_matching(/test_.*rb$/)
|
14
|
-
# end
|
15
|
-
#
|
16
|
-
# %w(TestA TestB).each do |klass|
|
17
|
-
# at.extra_class_map[klass] = "test/test_misc.rb"
|
18
|
-
# end
|
19
|
-
# end
|
20
|
-
|
21
|
-
# Autotest.add_hook :run_command do |at|
|
22
|
-
# system "rake build"
|
23
|
-
# end
|