linalg 1.0.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.
- checksums.yaml +7 -0
- data/LICENSE +24 -0
- data/ext/g2c_typedefs.h +5 -0
- data/ext/lapack/extconf.rb +309 -0
- data/ext/lapack/include/BLAS.h +154 -0
- data/ext/lapack/include/LAPACK.h +1314 -0
- data/ext/lapack/main.c +49 -0
- data/ext/lapack/rb_lapack.h +36 -0
- data/ext/lapack/rb_lapack_c.c +11614 -0
- data/ext/lapack/rb_lapack_d.c +12663 -0
- data/ext/lapack/rb_lapack_s.c +12649 -0
- data/ext/lapack/rb_lapack_x.c +208 -0
- data/ext/lapack/rb_lapack_z.c +11614 -0
- data/ext/linalg/dcomplex.c +359 -0
- data/ext/linalg/dcomplex.h +40 -0
- data/ext/linalg/ddata.c +194 -0
- data/ext/linalg/extconf.rb +324 -0
- data/ext/linalg/linalg.c +55 -0
- data/ext/linalg/linalg.h +21 -0
- data/ext/linalg/xdata.c +21 -0
- data/ext/linalg/xdata.h +33 -0
- data/ext/linalg/xmatrix.c.tmpl +1630 -0
- data/ext/linalg/xmatrix.h.tmpl +77 -0
- data/ext/linalg/xmatrixc.c.tmpl +138 -0
- data/ext/linalg/xmatrixr.c.tmpl +130 -0
- data/lib/lapack.rb +87 -0
- data/lib/linalg.rb +9 -0
- data/lib/linalg/dcomplex.rb +17 -0
- data/lib/linalg/dmatrix.rb +29 -0
- data/lib/linalg/dmatrix/alias.rb +32 -0
- data/lib/linalg/dmatrix/cholesky.rb +52 -0
- data/lib/linalg/dmatrix/cond.rb +80 -0
- data/lib/linalg/dmatrix/det.rb +36 -0
- data/lib/linalg/dmatrix/eigen.rb +153 -0
- data/lib/linalg/dmatrix/fit.rb +281 -0
- data/lib/linalg/dmatrix/inverse.rb +78 -0
- data/lib/linalg/dmatrix/lu.rb +120 -0
- data/lib/linalg/dmatrix/main.rb +244 -0
- data/lib/linalg/dmatrix/norms.rb +88 -0
- data/lib/linalg/dmatrix/nullspace.rb +114 -0
- data/lib/linalg/dmatrix/qr.rb +129 -0
- data/lib/linalg/dmatrix/schur.rb +88 -0
- data/lib/linalg/dmatrix/solve.rb +78 -0
- data/lib/linalg/dmatrix/svd.rb +125 -0
- data/lib/linalg/exception.rb +32 -0
- data/lib/linalg/iterators.rb +221 -0
- data/lib/linalg/math.rb +23 -0
- data/lib/linalg/scomplex.rb +15 -0
- data/lib/linalg/version.rb +3 -0
- data/lib/linalg/xdata.rb +123 -0
- metadata +94 -0
@@ -0,0 +1,32 @@
|
|
1
|
+
#
|
2
|
+
# Copyright (c) 2004-2008 by James M. Lawrence
|
3
|
+
#
|
4
|
+
# See LICENSE
|
5
|
+
#
|
6
|
+
|
7
|
+
module Linalg
|
8
|
+
module Exception
|
9
|
+
|
10
|
+
#
|
11
|
+
# The algorithm failed to converge.
|
12
|
+
#
|
13
|
+
class Diverged < RuntimeError
|
14
|
+
end
|
15
|
+
|
16
|
+
#
|
17
|
+
# One or more parameters failed to meet the
|
18
|
+
# prerequisite dimensions.
|
19
|
+
#
|
20
|
+
class DimensionError < RuntimeError
|
21
|
+
end
|
22
|
+
|
23
|
+
#
|
24
|
+
# A singular matrix was encountered where a nonsingular one
|
25
|
+
# was expected.
|
26
|
+
#
|
27
|
+
class SingularMatrix < RuntimeError
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
@@ -0,0 +1,221 @@
|
|
1
|
+
#
|
2
|
+
# Copyright (c) 2004-2008 by James M. Lawrence
|
3
|
+
#
|
4
|
+
# See LICENSE
|
5
|
+
#
|
6
|
+
|
7
|
+
|
8
|
+
module Linalg
|
9
|
+
|
10
|
+
#
|
11
|
+
# <tt>Enumerable</tt>s and <tt>Enumerable</tt>-like
|
12
|
+
# methods for matrices.
|
13
|
+
#
|
14
|
+
# For blocks which yield <tt>i,j</tt> indexes, the visitation is
|
15
|
+
# always in column-major order -- that is, +i+ changes faster than +j+.
|
16
|
+
#
|
17
|
+
# To visit in row-major order, one would say
|
18
|
+
# m.rows.each_with_index { |row, i|
|
19
|
+
# row.elems.each_with_index { |e, j|
|
20
|
+
# # e == m[i,j]
|
21
|
+
# }
|
22
|
+
# }
|
23
|
+
#
|
24
|
+
module Iterators
|
25
|
+
|
26
|
+
#
|
27
|
+
# Common +Enumerable+ for matrices
|
28
|
+
#
|
29
|
+
class MatrixEnum
|
30
|
+
include Enumerable
|
31
|
+
def initialize(m)
|
32
|
+
@m = m
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
#
|
37
|
+
# This class doesn't do much except +yield+ matrix elements.
|
38
|
+
#
|
39
|
+
class DiagEnum < MatrixEnum
|
40
|
+
def each
|
41
|
+
min = @m.hsize < @m.vsize ? @m.hsize : @m.vsize
|
42
|
+
min.times { |i|
|
43
|
+
yield @m[i,i]
|
44
|
+
}
|
45
|
+
@m
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
#
|
50
|
+
# This class doesn't do much except +yield+ matrix elements.
|
51
|
+
#
|
52
|
+
class ElemEnum < MatrixEnum
|
53
|
+
def each
|
54
|
+
(0...@m.hsize).each { |j|
|
55
|
+
(0...@m.vsize).each { |i|
|
56
|
+
yield @m[i,j]
|
57
|
+
}
|
58
|
+
}
|
59
|
+
@m
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
#
|
64
|
+
# This class doesn't do much except +yield+ columns.
|
65
|
+
#
|
66
|
+
class ColumnEnum < MatrixEnum
|
67
|
+
def each
|
68
|
+
@m.hsize.times { |i|
|
69
|
+
yield @m.column(i)
|
70
|
+
}
|
71
|
+
@m
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
#
|
76
|
+
# This class doesn't do much except +yield+ rows.
|
77
|
+
#
|
78
|
+
class RowEnum < MatrixEnum
|
79
|
+
def each
|
80
|
+
@m.vsize.times { |i|
|
81
|
+
yield @m.row(i)
|
82
|
+
}
|
83
|
+
@m
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
#
|
88
|
+
# Returns an +Enumerable+ of the rows
|
89
|
+
#
|
90
|
+
def rows
|
91
|
+
RowEnum.new(self)
|
92
|
+
end
|
93
|
+
|
94
|
+
#
|
95
|
+
# Returns an +Enumerable+ of the columns
|
96
|
+
#
|
97
|
+
def columns
|
98
|
+
ColumnEnum.new(self)
|
99
|
+
end
|
100
|
+
|
101
|
+
#
|
102
|
+
# Returns an +Enumerable+ of the matrix elements
|
103
|
+
#
|
104
|
+
def elems
|
105
|
+
ElemEnum.new(self)
|
106
|
+
end
|
107
|
+
|
108
|
+
#
|
109
|
+
# Returns an +Enumerable+ of the diagonal elements
|
110
|
+
#
|
111
|
+
def diags
|
112
|
+
DiagEnum.new(self)
|
113
|
+
end
|
114
|
+
|
115
|
+
#
|
116
|
+
# Like <tt>Enumerable#each_with_index</tt>, but with an index pair
|
117
|
+
#
|
118
|
+
def each_with_index # :yields: e, i, j
|
119
|
+
(0...hsize).each { |j|
|
120
|
+
(0...vsize).each { |i|
|
121
|
+
yield self[i,j], i, j
|
122
|
+
}
|
123
|
+
}
|
124
|
+
self
|
125
|
+
end
|
126
|
+
|
127
|
+
#
|
128
|
+
# Like <tt>Array#each_index</tt>, but with an index pair
|
129
|
+
#
|
130
|
+
def each_index
|
131
|
+
(0...hsize).each { |j|
|
132
|
+
(0...vsize).each { |i|
|
133
|
+
yield i, j
|
134
|
+
}
|
135
|
+
}
|
136
|
+
self
|
137
|
+
end
|
138
|
+
|
139
|
+
#
|
140
|
+
# Like <tt>Enumerable#map</tt>, but the resultant is a another matrix
|
141
|
+
#
|
142
|
+
def map # :yields: e
|
143
|
+
m = self.class.reserve(self.vsize, self.hsize)
|
144
|
+
each_with_index { |e, i, j|
|
145
|
+
m[i,j] = yield e
|
146
|
+
}
|
147
|
+
m
|
148
|
+
end
|
149
|
+
|
150
|
+
#
|
151
|
+
# +map+ with an index pair
|
152
|
+
#
|
153
|
+
def map_with_index # :yields: e, i, j
|
154
|
+
m = self.class.reserve(self.vsize, self.hsize)
|
155
|
+
each_with_index { |e, i, j|
|
156
|
+
m[i,j] = yield e, i, j
|
157
|
+
}
|
158
|
+
m
|
159
|
+
end
|
160
|
+
|
161
|
+
#
|
162
|
+
# In-place +map+
|
163
|
+
#
|
164
|
+
def map! # :yields: e
|
165
|
+
each_with_index { |e, i, j|
|
166
|
+
self[i,j] = yield e
|
167
|
+
}
|
168
|
+
self
|
169
|
+
end
|
170
|
+
|
171
|
+
#
|
172
|
+
# In-place +map_with_index+
|
173
|
+
#
|
174
|
+
def map_with_index! # :yields: e, i, j
|
175
|
+
each_with_index { |e, i, j|
|
176
|
+
self[i,j] = yield e, i, j
|
177
|
+
}
|
178
|
+
self
|
179
|
+
end
|
180
|
+
|
181
|
+
#
|
182
|
+
# Visit below-diagonal elements, with index pair
|
183
|
+
#
|
184
|
+
def each_lower_with_index # :yields: e, i, j
|
185
|
+
(0...hsize).each { |j|
|
186
|
+
((j+1)...vsize).each { |i|
|
187
|
+
yield self[i,j], i, j
|
188
|
+
}
|
189
|
+
}
|
190
|
+
self
|
191
|
+
end
|
192
|
+
|
193
|
+
#
|
194
|
+
# Visit above-diagonal elements, with index pair
|
195
|
+
#
|
196
|
+
def each_upper_with_index # :yields: e, i, j
|
197
|
+
(1...hsize).each { |j|
|
198
|
+
(0...(j > vsize ? vsize : j)).each { |i|
|
199
|
+
yield self[i,j], i, j
|
200
|
+
}
|
201
|
+
}
|
202
|
+
self
|
203
|
+
end
|
204
|
+
|
205
|
+
private
|
206
|
+
|
207
|
+
# this seems overkill.
|
208
|
+
#
|
209
|
+
# Like <tt>Enumerable#inject</tt>, but with an index pair
|
210
|
+
#
|
211
|
+
#def inject_with_index(initial) # :yields: memo, e, i, j
|
212
|
+
# res = initial
|
213
|
+
# each_with_index { |e, i, j|
|
214
|
+
# res = yield res, e, i, j
|
215
|
+
# }
|
216
|
+
# res
|
217
|
+
#end
|
218
|
+
|
219
|
+
end
|
220
|
+
end
|
221
|
+
|
data/lib/linalg/math.rb
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
#
|
2
|
+
# Copyright (c) 2004-2008 by James M. Lawrence
|
3
|
+
#
|
4
|
+
# See LICENSE
|
5
|
+
#
|
6
|
+
|
7
|
+
module Linalg
|
8
|
+
class Math
|
9
|
+
extend ::Math
|
10
|
+
|
11
|
+
def self.min(a, b)
|
12
|
+
a < b ? a : b
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.max(a, b)
|
16
|
+
a > b ? a : b
|
17
|
+
end
|
18
|
+
|
19
|
+
def self.log2(x)
|
20
|
+
::Math.log(x)/::Math.log(2.0)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
data/lib/linalg/xdata.rb
ADDED
@@ -0,0 +1,123 @@
|
|
1
|
+
#
|
2
|
+
# Copyright (c) 2004-2008 by James M. Lawrence
|
3
|
+
#
|
4
|
+
# See LICENSE
|
5
|
+
#
|
6
|
+
|
7
|
+
require 'linalg'
|
8
|
+
|
9
|
+
module Linalg
|
10
|
+
module XData
|
11
|
+
|
12
|
+
class NullClass
|
13
|
+
def to_doublecomplex_ptr
|
14
|
+
0
|
15
|
+
end
|
16
|
+
|
17
|
+
def to_complex_ptr
|
18
|
+
0
|
19
|
+
end
|
20
|
+
|
21
|
+
def to_doublereal_ptr
|
22
|
+
0
|
23
|
+
end
|
24
|
+
|
25
|
+
def to_real_ptr
|
26
|
+
0
|
27
|
+
end
|
28
|
+
|
29
|
+
def to_integer_ptr
|
30
|
+
0
|
31
|
+
end
|
32
|
+
|
33
|
+
def to_logical_ptr
|
34
|
+
0
|
35
|
+
end
|
36
|
+
|
37
|
+
def to_char_ptr
|
38
|
+
0
|
39
|
+
end
|
40
|
+
|
41
|
+
def to_L_fp
|
42
|
+
0
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
NULL = NullClass.new
|
47
|
+
|
48
|
+
class DReal < DData
|
49
|
+
def initialize(value = 0.0)
|
50
|
+
super(1)
|
51
|
+
self[0] = value
|
52
|
+
end
|
53
|
+
|
54
|
+
def value
|
55
|
+
self[0]
|
56
|
+
end
|
57
|
+
|
58
|
+
def value=(a)
|
59
|
+
self[0] = a
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
class SReal < SData
|
64
|
+
def initialize(value = 0.0)
|
65
|
+
super(1)
|
66
|
+
self[0] = value
|
67
|
+
end
|
68
|
+
|
69
|
+
def value
|
70
|
+
self[0]
|
71
|
+
end
|
72
|
+
|
73
|
+
def value=(a)
|
74
|
+
self[0] = a
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
class XInteger < IData
|
79
|
+
def initialize(value = 0)
|
80
|
+
super(1)
|
81
|
+
self[0] = value
|
82
|
+
end
|
83
|
+
|
84
|
+
def value
|
85
|
+
self[0]
|
86
|
+
end
|
87
|
+
|
88
|
+
def value=(a)
|
89
|
+
self[0] = a
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
class Logical < LData
|
94
|
+
def initialize(value = 0)
|
95
|
+
super(1)
|
96
|
+
self[0] = value
|
97
|
+
end
|
98
|
+
|
99
|
+
def value
|
100
|
+
self[0]
|
101
|
+
end
|
102
|
+
|
103
|
+
def value=(a)
|
104
|
+
self[0] = a
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
class Char < CharData
|
109
|
+
def initialize(value = "\0")
|
110
|
+
super(1)
|
111
|
+
self[0] = value
|
112
|
+
end
|
113
|
+
|
114
|
+
def value
|
115
|
+
self[0]
|
116
|
+
end
|
117
|
+
|
118
|
+
def value=(a)
|
119
|
+
self[0] = a
|
120
|
+
end
|
121
|
+
end
|
122
|
+
end
|
123
|
+
end
|
metadata
ADDED
@@ -0,0 +1,94 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: linalg
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.2
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- James M. Lawrence
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2014-01-04 00:00:00.000000000 Z
|
12
|
+
dependencies: []
|
13
|
+
description: A Fortran-based linear algebra package
|
14
|
+
email:
|
15
|
+
- quixoticsycophant@gmail.com
|
16
|
+
executables: []
|
17
|
+
extensions:
|
18
|
+
- ext/lapack/extconf.rb
|
19
|
+
- ext/linalg/extconf.rb
|
20
|
+
extra_rdoc_files: []
|
21
|
+
files:
|
22
|
+
- LICENSE
|
23
|
+
- ext/g2c_typedefs.h
|
24
|
+
- ext/lapack/extconf.rb
|
25
|
+
- ext/lapack/include/BLAS.h
|
26
|
+
- ext/lapack/include/LAPACK.h
|
27
|
+
- ext/lapack/main.c
|
28
|
+
- ext/lapack/rb_lapack.h
|
29
|
+
- ext/lapack/rb_lapack_c.c
|
30
|
+
- ext/lapack/rb_lapack_d.c
|
31
|
+
- ext/lapack/rb_lapack_s.c
|
32
|
+
- ext/lapack/rb_lapack_x.c
|
33
|
+
- ext/lapack/rb_lapack_z.c
|
34
|
+
- ext/linalg/dcomplex.c
|
35
|
+
- ext/linalg/dcomplex.h
|
36
|
+
- ext/linalg/ddata.c
|
37
|
+
- ext/linalg/extconf.rb
|
38
|
+
- ext/linalg/linalg.c
|
39
|
+
- ext/linalg/linalg.h
|
40
|
+
- ext/linalg/xdata.c
|
41
|
+
- ext/linalg/xdata.h
|
42
|
+
- ext/linalg/xmatrix.c.tmpl
|
43
|
+
- ext/linalg/xmatrix.h.tmpl
|
44
|
+
- ext/linalg/xmatrixc.c.tmpl
|
45
|
+
- ext/linalg/xmatrixr.c.tmpl
|
46
|
+
- lib/lapack.rb
|
47
|
+
- lib/linalg.rb
|
48
|
+
- lib/linalg/dcomplex.rb
|
49
|
+
- lib/linalg/dmatrix.rb
|
50
|
+
- lib/linalg/dmatrix/alias.rb
|
51
|
+
- lib/linalg/dmatrix/cholesky.rb
|
52
|
+
- lib/linalg/dmatrix/cond.rb
|
53
|
+
- lib/linalg/dmatrix/det.rb
|
54
|
+
- lib/linalg/dmatrix/eigen.rb
|
55
|
+
- lib/linalg/dmatrix/fit.rb
|
56
|
+
- lib/linalg/dmatrix/inverse.rb
|
57
|
+
- lib/linalg/dmatrix/lu.rb
|
58
|
+
- lib/linalg/dmatrix/main.rb
|
59
|
+
- lib/linalg/dmatrix/norms.rb
|
60
|
+
- lib/linalg/dmatrix/nullspace.rb
|
61
|
+
- lib/linalg/dmatrix/qr.rb
|
62
|
+
- lib/linalg/dmatrix/schur.rb
|
63
|
+
- lib/linalg/dmatrix/solve.rb
|
64
|
+
- lib/linalg/dmatrix/svd.rb
|
65
|
+
- lib/linalg/exception.rb
|
66
|
+
- lib/linalg/iterators.rb
|
67
|
+
- lib/linalg/math.rb
|
68
|
+
- lib/linalg/scomplex.rb
|
69
|
+
- lib/linalg/version.rb
|
70
|
+
- lib/linalg/xdata.rb
|
71
|
+
homepage: http://github.com/quix/linalg
|
72
|
+
licenses: []
|
73
|
+
metadata: {}
|
74
|
+
post_install_message:
|
75
|
+
rdoc_options: []
|
76
|
+
require_paths:
|
77
|
+
- lib
|
78
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
83
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
84
|
+
requirements:
|
85
|
+
- - ">="
|
86
|
+
- !ruby/object:Gem::Version
|
87
|
+
version: 1.3.6
|
88
|
+
requirements: []
|
89
|
+
rubyforge_project: linalg
|
90
|
+
rubygems_version: 2.2.0
|
91
|
+
signing_key:
|
92
|
+
specification_version: 4
|
93
|
+
summary: Ruby Linear Algebra Library
|
94
|
+
test_files: []
|