sparse_matrix 1.0.0 → 1.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +0 -4
- data/lib/sparse_matrix.rb +295 -152
- data/lib/sparse_matrix/version.rb +1 -1
- data/spec/sparsematrix_spec.rb +80 -3
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e4890f260249f7bd02beb51cf3cc713d450dcae7
|
4
|
+
data.tar.gz: c1d4379a558a4cdfb340a9492cb7b4893a7196bf
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5d56e3c8300c20e33415c72a700fa7e1c38a284d67a692b4b670a1a4aa9255fa7b6f6bdab22e79437f977189de37d087d3df856d02c174b77e5a56885475b9ce
|
7
|
+
data.tar.gz: b8e7865f84e0244438ab11453c350ecd4f30de4473ee3b4b8af75014646766760a55d5ac6d0ebb725843e1a48f9e26d37e17106dcd2d53ad2964a3cb7ddb5846
|
data/README.md
CHANGED
data/lib/sparse_matrix.rb
CHANGED
@@ -7,103 +7,152 @@ module SparseMatrix
|
|
7
7
|
@row = r
|
8
8
|
@column = c
|
9
9
|
end
|
10
|
-
|
10
|
+
|
11
11
|
attr_accessor :row,:column
|
12
|
-
|
13
|
-
def read_matrix
|
14
12
|
|
13
|
+
def read_matrix
|
14
|
+
raise "Error. metodo no definido."
|
15
15
|
end
|
16
16
|
|
17
17
|
def to_s
|
18
|
-
|
18
|
+
raise "Error. metodo no definido."
|
19
19
|
end
|
20
|
-
|
21
|
-
def print_matrix
|
22
|
-
|
23
|
-
end
|
24
|
-
|
25
|
-
def +(b)
|
26
20
|
|
21
|
+
def print_matrix
|
22
|
+
raise "Error. metodo no definido."
|
27
23
|
end
|
28
24
|
|
29
|
-
def
|
30
|
-
|
31
|
-
end
|
25
|
+
def +(b)
|
26
|
+
raise "Error. metodo no definido."
|
32
27
|
end
|
28
|
+
|
29
|
+
def *(b)
|
30
|
+
raise "Error. metodo no definido."
|
31
|
+
end
|
32
|
+
end
|
33
33
|
|
34
|
-
|
35
|
-
|
36
|
-
@
|
37
|
-
@
|
34
|
+
class SparseVector
|
35
|
+
def initialize(i=0,j=0,v=0)
|
36
|
+
@i = i
|
37
|
+
@j = j
|
38
|
+
@value = v
|
39
|
+
end
|
40
|
+
attr_accessor :i,:j,:value
|
41
|
+
|
42
|
+
def to_s
|
43
|
+
"#{@i},#{@j},#{@value}"
|
44
|
+
end
|
45
|
+
|
46
|
+
end
|
38
47
|
|
48
|
+
class SparseMatrix < AbstractMatrix
|
49
|
+
|
50
|
+
def initialize(*args)
|
51
|
+
@n,@m=args[0],args[1]
|
52
|
+
datos = args[2]
|
53
|
+
@MAT = Array.new()
|
54
|
+
for i in 0...@n
|
55
|
+
for j in 0...@m
|
56
|
+
if datos[i][j] != 0
|
57
|
+
@MAT[i]=SparseVector.new(i,j,datos[i][j])
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
@max=max()
|
62
|
+
@min=min()
|
39
63
|
end
|
64
|
+
attr_accessor :MAT
|
40
65
|
|
41
|
-
|
66
|
+
def insert(vector)
|
67
|
+
@MAT<<vector
|
68
|
+
end
|
42
69
|
|
70
|
+
def to_s
|
71
|
+
cadena=""
|
72
|
+
for i in 0...@n
|
73
|
+
cadena+="["
|
74
|
+
for j in 0...@m
|
75
|
+
cadena+=self.valor(i,j).to_s
|
76
|
+
if j < @m-1
|
77
|
+
cadena+=", "
|
78
|
+
end
|
79
|
+
end
|
80
|
+
cadena+="]"
|
81
|
+
end
|
82
|
+
return cadena
|
83
|
+
|
84
|
+
end
|
43
85
|
|
86
|
+
def valor(k,j)
|
87
|
+
dev=0
|
88
|
+
for i in 0...@MAT.size
|
89
|
+
if(@MAT[i].i==k) && (@MAT[i].j==j)
|
90
|
+
return @MAT[i].value
|
91
|
+
end
|
92
|
+
end
|
93
|
+
dev
|
44
94
|
end
|
45
95
|
|
46
96
|
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
97
|
+
def max
|
98
|
+
maximo=@MAT[0].value
|
99
|
+
for i in 0...@m do
|
100
|
+
if maximo < @MAT[i].value
|
101
|
+
maximo=@MAT[i].value
|
102
|
+
end
|
103
|
+
end
|
104
|
+
return maximo
|
52
105
|
end
|
53
106
|
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
for j in (0... @mat.length)
|
60
|
-
if j==0
|
61
|
-
s += "{ "
|
62
|
-
end
|
63
|
-
s += "#{@mat[i][j]}\t"
|
64
|
-
if j == @mat.length-1
|
65
|
-
s += " } , "
|
66
|
-
end
|
107
|
+
def min
|
108
|
+
minimo=@MAT[0].value
|
109
|
+
for i in (0...@m) do
|
110
|
+
if minimo > @MAT[i].value
|
111
|
+
minimo=@MAT[i].value
|
67
112
|
end
|
68
113
|
end
|
69
|
-
|
70
|
-
|
114
|
+
return minimo
|
115
|
+
end
|
71
116
|
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
for
|
76
|
-
|
77
|
-
|
117
|
+
def +(other)
|
118
|
+
if other.instance_of? SparseMatrix
|
119
|
+
o=DenseMatrix.new(@n,@m,Array.new(@n){Array.new(@m)})
|
120
|
+
for i in 0...@MAT.size
|
121
|
+
for j in 0...@MAT.size
|
122
|
+
o.mat[i][j]=self.valor(i,j)+other.valor(i,j)
|
78
123
|
end
|
79
|
-
|
80
|
-
|
81
|
-
|
124
|
+
end
|
125
|
+
return SparseMatrix.new(@n,@m,o.mat) #SparseMatrix.new(@n,@m,o)
|
126
|
+
else
|
127
|
+
o=DenseMatrix.new(@n,@m,Array.new(@n){Array.new(@m)})
|
128
|
+
for i in 0...@n
|
129
|
+
for j in 0...@m
|
130
|
+
o.mat[i][j]=self.valor(i,j)+other.mat[i][j]
|
82
131
|
end
|
83
132
|
end
|
133
|
+
return o
|
84
134
|
end
|
85
|
-
printf "|"
|
86
135
|
end
|
87
|
-
|
88
|
-
def
|
136
|
+
|
137
|
+
def *(b)
|
138
|
+
if b.instance_of? SparseMatrix
|
89
139
|
c = DenseMatrix.new(2,2,[[0.0,0.0],[0.0,0.0]])
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
140
|
+
for i in(0...@MAT.size)
|
141
|
+
for j in(0...@MAT.size)
|
142
|
+
c.mat[i][j]=0
|
143
|
+
for k in (0...@MAT.size)
|
144
|
+
c.mat[i][j] += self.valor(i,k)*b.valor(k,j)
|
145
|
+
end
|
94
146
|
end
|
95
147
|
end
|
96
148
|
c
|
97
|
-
|
98
|
-
|
99
|
-
def *(b)
|
149
|
+
else
|
100
150
|
c = DenseMatrix.new(2,2,[[0.0,0.0],[0.0,0.0]])
|
101
|
-
|
102
|
-
|
103
|
-
for j in(0...@mat.length)
|
151
|
+
for i in(0...@MAT.size)
|
152
|
+
for j in(0...@MAT.size)
|
104
153
|
c.mat[i][j]=0
|
105
|
-
for k in (0...@
|
106
|
-
c.mat[i][j] +=
|
154
|
+
for k in (0...@MAT.size)
|
155
|
+
c.mat[i][j] += self.valor(i,k)*b.mat[k][j]
|
107
156
|
end
|
108
157
|
end
|
109
158
|
end
|
@@ -111,107 +160,201 @@ module SparseMatrix
|
|
111
160
|
end
|
112
161
|
end
|
113
162
|
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
163
|
+
end
|
164
|
+
|
165
|
+
|
166
|
+
class DenseMatrix < AbstractMatrix
|
167
|
+
@mat
|
168
|
+
def initialize(r=0,c=0,matrix=[])
|
169
|
+
super(r,c)
|
170
|
+
@mat = matrix
|
171
|
+
end
|
172
|
+
|
173
|
+
attr_accessor :mat,:r,:c
|
174
|
+
|
175
|
+
def to_s()
|
176
|
+
s="| "
|
177
|
+
for i in (0... @mat.length)
|
178
|
+
for j in (0... @mat.length)
|
179
|
+
if j==0
|
180
|
+
s += "{ "
|
181
|
+
end
|
182
|
+
s += "#{@mat[i][j]}\t"
|
183
|
+
if j == @mat.length-1
|
184
|
+
s += " } , "
|
185
|
+
end
|
124
186
|
end
|
125
187
|
end
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
@
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
c = @num_.to_f/@den_.to_f
|
141
|
-
return c.abs
|
142
|
-
end
|
143
|
-
|
144
|
-
def reciprocal
|
145
|
-
f=Fraction.new
|
146
|
-
f.num_=@den_
|
147
|
-
f.den_ = @num_
|
148
|
-
f
|
149
|
-
end
|
150
|
-
|
151
|
-
def -@
|
152
|
-
Fraction.new(-@num_,@den_)
|
153
|
-
end
|
154
|
-
|
155
|
-
def +(b)
|
156
|
-
r=Fraction.new
|
157
|
-
if (@den_==b.den_)
|
158
|
-
r.num_ = @num_ + b.num_
|
159
|
-
r.den_ = @den_
|
160
|
-
else
|
161
|
-
r.num_ = @num_ * b.den_ + b.num_ * @den_
|
162
|
-
r.den_ = @den_ * b.den_
|
188
|
+
s += "|"
|
189
|
+
end
|
190
|
+
|
191
|
+
def print_matrix()
|
192
|
+
printf "| "
|
193
|
+
for i in (0... @mat.length)
|
194
|
+
for j in (0... @mat.length)
|
195
|
+
if j==0
|
196
|
+
printf "{ "
|
197
|
+
end
|
198
|
+
printf "#{@mat[i][j]}\t"
|
199
|
+
if j == @mat.length-1
|
200
|
+
printf " } ,"
|
201
|
+
end
|
163
202
|
end
|
164
|
-
r.num_,r.den_ = minimiza(r.num_,r.den_)
|
165
|
-
return r
|
166
203
|
end
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
204
|
+
printf "|"
|
205
|
+
end
|
206
|
+
|
207
|
+
def +(b)
|
208
|
+
c = DenseMatrix.new(2,2,[[0.0,0.0],[0.0,0.0]])
|
209
|
+
if b.instance_of? SparseMatrix
|
210
|
+
for i in (0...@mat.length)
|
211
|
+
for j in (0...@mat.size)
|
212
|
+
c.mat[i][j] = self.mat[i][j]+b.valor(i,j)
|
213
|
+
end
|
214
|
+
end
|
215
|
+
c
|
216
|
+
else
|
217
|
+
for i in (0...mat.length)
|
218
|
+
for j in (0...@mat.size)
|
219
|
+
c.mat[i][j] = self.mat[i][j]+b.mat[i][j]
|
220
|
+
end
|
221
|
+
end
|
222
|
+
c
|
223
|
+
end
|
224
|
+
end
|
225
|
+
|
226
|
+
def *(b)
|
227
|
+
if b.instance_of? SparseMatrix
|
228
|
+
c = DenseMatrix.new(2,2,[[0.0,0.0],[0.0,0.0]])
|
229
|
+
for i in(0...@mat.length)
|
230
|
+
for j in(0...@mat.length)
|
231
|
+
c.mat[i][j]=0
|
232
|
+
for k in (0...@mat.length)
|
233
|
+
c.mat[i][j] += @mat[i][k]*b.valor(k,j)
|
176
234
|
end
|
177
|
-
r.num_,r.den_ = minimiza(r.num_,r.den_)
|
178
|
-
r
|
179
235
|
end
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
236
|
+
end
|
237
|
+
c
|
238
|
+
else
|
239
|
+
c = DenseMatrix.new(2,2,[[0.0,0.0],[0.0,0.0]])
|
240
|
+
for i in(0...@mat.length)
|
241
|
+
for j in(0...@mat.length)
|
242
|
+
c.mat[i][j]=0
|
243
|
+
for k in (0...@mat.length)
|
244
|
+
c.mat[i][j] += @mat[i][k]*b.mat[k][j]
|
245
|
+
end
|
187
246
|
end
|
247
|
+
end
|
248
|
+
c
|
249
|
+
end
|
250
|
+
end
|
251
|
+
end
|
188
252
|
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
end
|
200
|
-
|
201
|
-
def minimiza(x,y)
|
202
|
-
d = gcd(x,y)
|
203
|
-
x = x/d
|
204
|
-
y = y/d
|
205
|
-
return x,y
|
253
|
+
class Fraction
|
254
|
+
include Comparable
|
255
|
+
def initialize (*args)
|
256
|
+
if args.size == 2
|
257
|
+
c = gcd(args[0],args[1])
|
258
|
+
@num_ = (args[0]/c)
|
259
|
+
@den_ = (args[1]/c)
|
260
|
+
else
|
261
|
+
@num_ = args[0]
|
262
|
+
@den_ = 1
|
206
263
|
end
|
207
264
|
end
|
265
|
+
attr_accessor :num_,:den_
|
266
|
+
|
267
|
+
def to_s
|
268
|
+
"#{@num_}/#{@den_}"
|
269
|
+
end
|
270
|
+
def to_f
|
271
|
+
@num_.to_f/@den_.to_f
|
272
|
+
end
|
273
|
+
|
274
|
+
def ==(b)
|
275
|
+
return @num_.eql?(b.num_) && @den_.eql?(b.den_)
|
276
|
+
end
|
208
277
|
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
278
|
+
def abs
|
279
|
+
c = @num_.to_f/@den_.to_f
|
280
|
+
return c.abs
|
281
|
+
end
|
282
|
+
|
283
|
+
def reciprocal
|
284
|
+
f=Fraction.new
|
285
|
+
f.num_=@den_
|
286
|
+
f.den_ = @num_
|
287
|
+
f
|
288
|
+
end
|
289
|
+
|
290
|
+
def -@
|
291
|
+
Fraction.new(-@num_,@den_)
|
292
|
+
end
|
293
|
+
|
294
|
+
def +(b)
|
295
|
+
r=Fraction.new
|
296
|
+
if (@den_==b.den_)
|
297
|
+
r.num_ = @num_ + b.num_
|
298
|
+
r.den_ = @den_
|
299
|
+
else
|
300
|
+
r.num_ = @num_ * b.den_ + b.num_ * @den_
|
301
|
+
r.den_ = @den_ * b.den_
|
302
|
+
end
|
303
|
+
r.num_,r.den_ = minimiza(r.num_,r.den_)
|
304
|
+
return r
|
305
|
+
end
|
306
|
+
|
307
|
+
def -(b)
|
308
|
+
r =Fraction.new
|
309
|
+
if (@den_ == b.den_)
|
310
|
+
r.num_=@num_- b.num_
|
311
|
+
r.den_=@den_
|
312
|
+
else
|
313
|
+
r.num_=@num_ * b.den_ - b.num_ * @den_
|
314
|
+
r.den_ = @den_ * b.den_
|
315
|
+
end
|
316
|
+
r.num_,r.den_ = minimiza(r.num_,r.den_)
|
317
|
+
r
|
318
|
+
end
|
319
|
+
|
320
|
+
def *(b)
|
321
|
+
r =Fraction.new
|
322
|
+
r.num_=@num_ * b.num_
|
323
|
+
r.den_=@den_ * b.den_
|
324
|
+
r.num_,r.den_ = minimiza(r.num_,r.den_)
|
325
|
+
return r
|
326
|
+
end
|
327
|
+
|
328
|
+
def /(b)
|
329
|
+
r =Fraction.new
|
330
|
+
r.num_=@num_ / b.num_
|
331
|
+
r.den_=@den_ * b.den_
|
332
|
+
r.num_,r.den_ = minimiza(r.num_,r.den_)
|
333
|
+
r
|
334
|
+
end
|
335
|
+
|
336
|
+
def <=>(b)
|
337
|
+
self.to_f <=> b.to_f
|
338
|
+
end
|
339
|
+
|
340
|
+
def minimiza(x,y)
|
341
|
+
d = gcd(x,y)
|
342
|
+
x = x/d
|
343
|
+
y = y/d
|
344
|
+
return x,y
|
345
|
+
end
|
346
|
+
|
347
|
+
def coerce(other)
|
348
|
+
[self,other]
|
349
|
+
end
|
350
|
+
end
|
351
|
+
|
352
|
+
def gcd(u, v)
|
353
|
+
u, v = u.abs, v.abs
|
354
|
+
while v != 0
|
355
|
+
u, v = v, u % v
|
215
356
|
end
|
357
|
+
u
|
358
|
+
end
|
216
359
|
|
217
360
|
end
|
data/spec/sparsematrix_spec.rb
CHANGED
@@ -36,14 +36,90 @@ describe SparseMatrix do
|
|
36
36
|
end
|
37
37
|
|
38
38
|
describe SparseVector do
|
39
|
-
|
39
|
+
before :all do
|
40
|
+
SV = []
|
41
|
+
SVF = []
|
42
|
+
SV << SparseVector.new(1,2,3.0)
|
43
|
+
FRAC = Fraction.new(1,4)
|
44
|
+
SVF << SparseVector.new(1,1,FRAC)
|
45
|
+
|
46
|
+
end
|
47
|
+
describe "Basicas" do
|
48
|
+
it 'existe una clase sparse vector' do
|
49
|
+
SV.instance_of?(SparseVector) == true
|
50
|
+
end
|
51
|
+
it 'existen los getter y setter? (i)' do
|
52
|
+
SV[0].i.should == 1
|
53
|
+
end
|
54
|
+
it 'existen los getter y setter? (j)' do
|
55
|
+
SV[0].j.should == 2
|
56
|
+
end
|
57
|
+
it 'existen los getter y setter? (value)' do
|
58
|
+
SV[0].value.should == 3.0
|
59
|
+
end
|
60
|
+
end
|
61
|
+
describe "Configuracion y muestreo" do
|
62
|
+
it 'existe un metodo to_s' do
|
63
|
+
SV.should respond_to("to_s")
|
64
|
+
end
|
65
|
+
it 'se retorna correctamente un vector (sin Fraccion)' do
|
66
|
+
SV[0].to_s.should eq("1,2,3.0")
|
67
|
+
end
|
68
|
+
it 'se retorna correctamente un vector (con Fraccion)' do
|
69
|
+
SVF[0].to_s.should eq("1,1,1/4")
|
70
|
+
end
|
71
|
+
end
|
40
72
|
end
|
41
73
|
|
42
74
|
describe SparseMatrix do
|
43
|
-
|
75
|
+
before :all do
|
76
|
+
DM = DenseMatrix.new(2,2,[[1.0,2.0],[4.0,5.0]])
|
77
|
+
SM = SparseMatrix::SparseMatrix.new(2,2,[[2.0,0.0],[4.0,0.0]])
|
78
|
+
end
|
79
|
+
describe "Basicas" do
|
80
|
+
it 'existe una clase sparse Matrix' do
|
81
|
+
SM.instance_of?(SparseMatrix) == true
|
82
|
+
end
|
83
|
+
it 'Existe metodo insertar registro' do
|
84
|
+
SM.should respond_to("insert")
|
85
|
+
end
|
86
|
+
it 'Existe metodo to_s' do
|
87
|
+
SM.should respond_to("to_s")
|
88
|
+
end
|
89
|
+
end
|
90
|
+
describe "funcionalidades" do
|
91
|
+
it 'existe metodo maximo' do
|
92
|
+
SM.should respond_to("max")
|
93
|
+
end
|
94
|
+
it 'existe metodo minimo' do
|
95
|
+
SM.should respond_to("min")
|
96
|
+
end
|
97
|
+
it 'calcula el maximo correctamente' do
|
98
|
+
SM.max.should==4
|
99
|
+
end
|
100
|
+
it 'calcula el minimo correctamente' do
|
101
|
+
SM.min.should==2
|
102
|
+
end
|
103
|
+
it 'calcula la suma de matrices dispersa + densa' do
|
104
|
+
(SM+DM).to_s.should=="| { 3.0\t2.0\t } , { 8.0\t5.0\t } , |"
|
105
|
+
end
|
106
|
+
it 'calcula la suma de matrices densa + dispersa' do
|
107
|
+
(DM+SM).to_s.should=="| { 3.0\t2.0\t } , { 8.0\t5.0\t } , |"
|
108
|
+
end
|
109
|
+
it 'calcula la suma de matrices dispersa + dispersa' do
|
110
|
+
(SM+SM).to_s.should=="[4.0, 0][8.0, 0]"
|
111
|
+
end
|
112
|
+
it 'calcula la multiplicacion matrices dispersa * densa' do
|
113
|
+
(SM*DM).to_s.should=="| { 2.0\t4.0\t } , { 4.0\t8.0\t } , |"
|
114
|
+
end
|
115
|
+
it 'calcula la multiplicacion matrices densa * dispersa' do
|
116
|
+
(DM*SM).to_s.should=="| { 10.0\t0.0\t } , { 28.0\t0.0\t } , |"
|
117
|
+
end
|
118
|
+
it 'calcula la multiplicacion matrices dispersa * dispersa' do
|
119
|
+
(SM*SM).to_s.should=="| { 4.0\t0.0\t } , { 8.0\t0.0\t } , |"
|
120
|
+
end
|
44
121
|
end
|
45
122
|
|
46
|
-
|
47
123
|
describe DenseMatrix do
|
48
124
|
before :all do
|
49
125
|
DMA = DenseMatrix.new(2,2,[[1.0,2.0],[4.0,5.0]])
|
@@ -89,6 +165,7 @@ describe SparseMatrix do
|
|
89
165
|
it 'multiplicar matrices, multiplica correctamente?' do
|
90
166
|
(DMA*DMB).to_s.should eq("| { 7.0\t10.0\t } , { 19.0\t28.0\t } , |")
|
91
167
|
end
|
168
|
+
end
|
92
169
|
end
|
93
170
|
|
94
171
|
describe Fraction do
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sparse_matrix
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- KevinRobayna
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-11-
|
11
|
+
date: 2013-11-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|