Skip to content

Commit 5fb38e9

Browse files
committed
Do not use randomness in tests
1 parent c881227 commit 5fb38e9

File tree

7 files changed

+174
-159
lines changed

7 files changed

+174
-159
lines changed

src/Math-Matrix-Tests/PMAdditionalTest.class.st

Lines changed: 29 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -14,32 +14,42 @@ PMAdditionalTest >> testMatrixInversionSmall [
1414

1515
| m c i |
1616
c := PMSymmetricMatrix identity: 5.
17-
3
18-
timesRepeat: [ [ m := PMSymmetricMatrix new: 5 random: 20.
19-
m determinant = 0 ] whileTrue. "singular matrix not allowed"
20-
self assert: (i := m crlInverse) * m closeTo: c.
21-
self assert: i class equals: PMSymmetricMatrix.
22-
self assert: (i := m inversePureLUP) * m closeTo: c.
23-
self assert: i class equals: PMSymmetricMatrix.
24-
self assert: m * (i := m inversePureCRL) closeTo: c.
25-
self assert: i class equals: PMSymmetricMatrix ].
26-
3
27-
timesRepeat: [ [ m := PMMatrix rows: 5 columns: 5 random: 20.
28-
m determinant = 0 ] whileTrue.
29-
self assert: m * (i := m inverse) closeTo: c.
30-
self assert: i class equals: PMMatrix.
31-
self assert: (i := m inversePureCRL) * m closeTo: c.
32-
self assert: i class equals: PMMatrix ]
17+
3 timesRepeat: [
18+
[
19+
m := PMSymmetricMatrix new: 5 random: 20 generator: (Random seed: 42).
20+
m determinant = 0 ] whileTrue. "singular matrix not allowed"
21+
self assert: (i := m crlInverse) * m closeTo: c.
22+
self assert: i class equals: PMSymmetricMatrix.
23+
self assert: (i := m inversePureLUP) * m closeTo: c.
24+
self assert: i class equals: PMSymmetricMatrix.
25+
self assert: m * (i := m inversePureCRL) closeTo: c.
26+
self assert: i class equals: PMSymmetricMatrix ].
27+
3 timesRepeat: [
28+
[
29+
m := PMMatrix
30+
rows: 5
31+
columns: 5
32+
random: 20
33+
generator: (Random seed: 42).
34+
m determinant = 0 ] whileTrue.
35+
self assert: m * (i := m inverse) closeTo: c.
36+
self assert: i class equals: PMMatrix.
37+
self assert: (i := m inversePureCRL) * m closeTo: c.
38+
self assert: i class equals: PMMatrix ]
3339
]
3440

3541
{ #category : #tests }
3642
PMAdditionalTest >> testMatrixSquared [
3743
"this tests squared and is not in Math-Tests-Numerical since it uses random matrices"
3844

3945
| a |
40-
10
41-
timesRepeat: [ a := PMMatrix rows: 20 columns: 21 random: 10.0.
42-
self assert: a squared equals: a transpose * a ].
46+
10 timesRepeat: [
47+
a := PMMatrix
48+
rows: 20
49+
columns: 21
50+
random: 10.0
51+
generator: (Random seed: 42).
52+
self assert: a squared equals: a transpose * a ].
4353
self assert: a squared class equals: PMSymmetricMatrix
4454
]
4555

src/Math-Matrix-Tests/PMQRTest.class.st

Lines changed: 53 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -98,25 +98,29 @@ PMQRTest >> testMoorePenroseInverseOfNonRandomMatrix [
9898

9999
{ #category : #tests }
100100
PMQRTest >> testMoorePenroseInverseOfProductOfMatrices [
101+
101102
| a inverse |
102-
a := PMMatrix new initializeRows:
103-
#( #( 5 40 1 ) #( 0 0 1 ) #( 0 0 1 ) ).
104-
105-
a := a * (PMMatrix rows: 3 columns: 3 random: 5.0).
106-
inverse := a mpInverse .
107-
self assert: inverse isMoorePenroseInverseOf: a.
103+
a := PMMatrix new initializeRows: #( #( 5 40 1 ) #( 0 0 1 ) #( 0 0 1 ) ).
104+
105+
a := a * (PMMatrix
106+
rows: 3
107+
columns: 3
108+
random: 5.0
109+
generator: (Random seed: 42)).
110+
inverse := a mpInverse.
111+
self assert: inverse isMoorePenroseInverseOf: a
108112
]
109113

110114
{ #category : #tests }
111115
PMQRTest >> testMoorePenroseInverseOfRandomMatrixIsAnInverse [
112-
"
116+
"
113117
Proofs for the properties below can be found in literature:
114118
If A has real entries, then so does A+
115119
If A is invertible, its pseudoinverse is its inverse. That is, A+ = A**−1
116120
"
117121

118122
| a |
119-
a := PMSymmetricMatrix new: 4 random: 1.0.
123+
a := PMSymmetricMatrix new: 4 random: 1.0 generator: (Random seed: 42).
120124
self assert: (a mpInverse closeTo: a inverse)
121125
]
122126

@@ -125,9 +129,13 @@ PMQRTest >> testOrthogonalize [
125129

126130
| a b i |
127131
i := 0.
128-
[
129-
a := PMMatrix rows: 5 columns: 5 random: 5.0.
130-
a rank = 5 ifTrue: [
132+
[
133+
a := PMMatrix
134+
rows: 5
135+
columns: 5
136+
random: 5.0
137+
generator: (Random seed: 42).
138+
a rank = 5 ifTrue: [
131139
a atRow: 2 put: (a rowAt: 1) + (3 * (a rowAt: 3)).
132140
a atRow: 4 put: 3.11 * (a rowAt: 2).
133141
b := a orthogonalize.
@@ -146,60 +154,55 @@ PMQRTest >> testOrthogonalize [
146154
PMQRTest >> testQRFactorization [
147155

148156
| a qr |
149-
5 timesRepeat: [
150-
a := PMMatrix rows: 5 columns: 4 random: 10.0.
157+
5 timesRepeat: [
158+
a := PMMatrix
159+
rows: 5
160+
columns: 4
161+
random: 10.0
162+
generator: (Random seed: 42).
151163
qr := a qrFactorization.
152164
self assert: (a closeTo: qr first * qr second).
153-
self assert: (qr first squared closeTo:
154-
(PMSymmetricMatrix identity: qr first numberOfColumns)).
155-
2 to: qr second numberOfRows do: [ :r |
156-
self assert: (((qr second rowAt: r) first: r - 1) closeTo:
157-
(Array new: r - 1 withAll: 0)) ].
165+
self assert: (qr first squared closeTo: (PMSymmetricMatrix identity: qr first numberOfColumns)).
166+
2 to: qr second numberOfRows do: [ :r | self assert: (((qr second rowAt: r) first: r - 1) closeTo: (Array new: r - 1 withAll: 0)) ].
158167

159168
qr := a qrFactorizationWithPivoting.
160-
self assert:
161-
(a closeTo: qr first * (qr second inversePivotColumns: (qr at: 3))).
162-
self assert: (qr first squared closeTo:
163-
(PMSymmetricMatrix identity: qr first numberOfColumns)).
164-
2 to: qr second numberOfRows do: [ :r |
165-
self assert: (((qr second rowAt: r) first: r - 1) closeTo:
166-
(Array new: r - 1 withAll: 0)) ].
167-
168-
a := PMSymmetricMatrix new: 4 random: 10.0.
169+
self assert: (a closeTo: qr first * (qr second inversePivotColumns: (qr at: 3))).
170+
self assert: (qr first squared closeTo: (PMSymmetricMatrix identity: qr first numberOfColumns)).
171+
2 to: qr second numberOfRows do: [ :r | self assert: (((qr second rowAt: r) first: r - 1) closeTo: (Array new: r - 1 withAll: 0)) ].
172+
173+
a := PMSymmetricMatrix new: 4 random: 10.0 generator: (Random seed: 42).
169174
qr := a qrFactorization.
170175
self assert: (a closeTo: qr first * qr second).
171-
self assert: (qr first squared closeTo:
172-
(PMSymmetricMatrix identity: qr first numberOfColumns)).
173-
2 to: qr second numberOfRows do: [ :r |
174-
self assert: (((qr second rowAt: r) first: r - 1) closeTo:
175-
(Array new: r - 1 withAll: 0)) ].
176+
self assert: (qr first squared closeTo: (PMSymmetricMatrix identity: qr first numberOfColumns)).
177+
2 to: qr second numberOfRows do: [ :r | self assert: (((qr second rowAt: r) first: r - 1) closeTo: (Array new: r - 1 withAll: 0)) ].
176178

177179
qr := a qrFactorizationWithPivoting.
178-
self assert:
179-
(a closeTo: qr first * (qr second inversePivotColumns: (qr at: 3))).
180-
self assert: (qr first squared closeTo:
181-
(PMSymmetricMatrix identity: qr first numberOfColumns)).
182-
2 to: qr second numberOfRows do: [ :r |
183-
self assert: (((qr second rowAt: r) first: r - 1) closeTo:
184-
(Array new: r - 1 withAll: 0)) ] ]
180+
self assert: (a closeTo: qr first * (qr second inversePivotColumns: (qr at: 3))).
181+
self assert: (qr first squared closeTo: (PMSymmetricMatrix identity: qr first numberOfColumns)).
182+
2 to: qr second numberOfRows do: [ :r | self assert: (((qr second rowAt: r) first: r - 1) closeTo: (Array new: r - 1 withAll: 0)) ] ]
185183
]
186184

187185
{ #category : #tests }
188186
PMQRTest >> testRank [
187+
189188
| random randomNumber matrix |
190189
random := Random new.
191-
190+
192191
10 timesRepeat: [
193-
matrix := PMMatrix rows: 5 columns: 7 random: 5.0.
192+
matrix := PMMatrix
193+
rows: 5
194+
columns: 7
195+
random: 5.0
196+
generator: (Random seed: 42).
194197
matrix rank = 5 ifTrue: [
195198
randomNumber := random nextBetween: 0 and: 3.
196199
matrix atRow: 2 put: (matrix rowAt: 1) + (randomNumber * (matrix rowAt: 3)).
197-
200+
198201
randomNumber := random nextBetween: 0 and: 3.
199-
matrix atRow: 4 put: (0.5 + randomNumber) * (matrix rowAt: 5).
200-
202+
matrix atRow: 4 put: 0.5 + randomNumber * (matrix rowAt: 5).
203+
201204
self assert: matrix rank equals: 3.
202-
self assert: matrix transpose rank equals: 3 ] ].
205+
self assert: matrix transpose rank equals: 3 ] ]
203206
]
204207

205208
{ #category : #tests }
@@ -243,17 +246,14 @@ PMQRTest >> testSimpleQRDecompositionWithPivot [
243246

244247
{ #category : #tests }
245248
PMQRTest >> testVectorHouseholder [
246-
247249
"result is householdermatrix * v"
248250

249-
(2 to: 5) do: [ :i |
251+
(2 to: 5) do: [ :i |
250252
| v h result |
251-
(1 to: 9) do: [ :unimportant |
252-
v := PMVector new: i random: 5.8.
253+
(1 to: 9) do: [ :unimportant |
254+
v := PMVector new: i random: 5.8 generator: (Random seed: 42).
253255
h := v householder.
254-
result := (PMSymmetricMatrix identity: i)
255-
- ((h at: 1) * (h at: 2) tensorProduct: (h at: 2)) * v.
256+
result := (PMSymmetricMatrix identity: i) - ((h at: 1) * (h at: 2) tensorProduct: (h at: 2)) * v.
256257
self deny: (result first closeTo: 0).
257-
result allButFirst do: [ :aNumber |
258-
self assert: (aNumber closeTo: 0) ] ] ]
258+
result allButFirst do: [ :aNumber | self assert: (aNumber closeTo: 0) ] ] ]
259259
]

src/Math-Matrix-Tests/PMRestTest.class.st

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,11 @@ Class {
88
PMRestTest >> testEqualsTo [
99

1010
| a b |
11-
a := PMMatrix rows: 5 columns: 7 random: 5.0.
11+
a := PMMatrix
12+
rows: 5
13+
columns: 7
14+
random: 5.0
15+
generator: (Random seed: 42).
1216
b := a deepCopy.
1317
self assert: (a closeTo: b).
1418
b rowAt: 4 columnAt: 6 put: 6.
@@ -17,12 +21,10 @@ PMRestTest >> testEqualsTo [
1721

1822
{ #category : #tests }
1923
PMRestTest >> testNewRandom [
20-
|a |
21-
a:=PMSymmetricMatrix new:7 random: 5.0 .
22-
a:=PMMatrix rows: a rows.
23-
self assert: (a isSymmetric ).
24-
2524

25+
| a |
26+
a := PMSymmetricMatrix new: 7 random: 5.0 generator: (Random seed: 42).
27+
self assert: a isSymmetric
2628
]
2729

2830
{ #category : #tests }

src/Math-Matrix/PMMatrix.class.st

Lines changed: 49 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -20,51 +20,52 @@ Class {
2020

2121
{ #category : #example }
2222
PMMatrix class >> example [
23-
""
24-
|a b c d|
25-
"This is how we can create a matrix, a and b are 2x3 matrices in
23+
""
24+
25+
| a b c d |
26+
"This is how we can create a matrix, a and b are 2x3 matrices in
2627
this example"
27-
a := PMMatrix rows: #( ( 1 0 1 ) (-1 -2 3)).
28-
b := PMMatrix rows: #( ( 1 2 3 ) (-2 1 7)).
28+
a := PMMatrix rows: #( #( 1 0 1 ) #( -1 -2 3 ) ).
29+
b := PMMatrix rows: #( #( 1 2 3 ) #( -2 1 7 ) ).
2930

30-
"Matrix product"
31-
c := a * b.
31+
"Matrix product"
32+
c := a * b.
3233

33-
"Elementwise matrix product"
34-
d := a hadamardProduct: b.
34+
"Elementwise matrix product"
35+
d := a hadamardProduct: b.
3536

36-
"This is how we can create a vector"
37-
a := #(1 4 9 16 25) asPMVector.
37+
"This is how we can create a vector"
38+
a := #( 1 4 9 16 25 ) asPMVector.
3839

39-
"Vectors and Matrices support basic logical and arithmetic
40+
"Vectors and Matrices support basic logical and arithmetic
4041
operations"
41-
Float pi sin * d.
42-
a sqrt.
43-
a > 3.
44-
c cos.
45-
c < 0.
42+
Float pi sin * d.
43+
a sqrt.
44+
a > 3.
45+
c cos.
46+
c < 0.
4647

47-
"It is possible to create a vector/matrix of random numbers"
48-
a := PMVector randomSize: 10 maxNumber: 3.
49-
b := PMMatrix rows: 2 columns: 3 random: 5.
48+
"It is possible to create a vector/matrix of random numbers"
49+
a := PMVector randomSize: 10 maxNumber: 3.
50+
b := PMMatrix rows: 2 columns: 3 random: 5.
5051

51-
"It is also easy to create a vector/matrix of zeros/ones"
52-
a := PMVector ones:15.
53-
b := PMMatrix zerosRows: 2 cols: 3.
52+
"It is also easy to create a vector/matrix of zeros/ones"
53+
a := PMVector ones: 15.
54+
b := PMMatrix zerosRows: 2 cols: 3.
5455

55-
"We can also compute the cumulative sum or regular sum the vector/
56+
"We can also compute the cumulative sum or regular sum the vector/
5657
matrix as following"
57-
a := PMMatrix rows: #( ( 1 0 1 ) (-1 -2 3)).
58-
a cumsum.
59-
"a PMVector(1 1 2)"
60-
"a PMVector(-1 -3 0)"
61-
a sum.
62-
"a PMVector(2 0)"
58+
a := PMMatrix rows: #( #( 1 0 1 ) #( -1 -2 3 ) ).
59+
a cumsum.
60+
"a PMVector(1 1 2)"
61+
"a PMVector(-1 -3 0)"
62+
a sum.
63+
"a PMVector(2 0)"
6364

64-
"Matrix trace (sum of a diagonal elements for a square matrix)"
65-
a := PMMatrix rows: #((1 2 3)(4 5 6)(7 8 9)).
66-
a tr.
67-
"15"
65+
"Matrix trace (sum of a diagonal elements for a square matrix)"
66+
a := PMMatrix rows: #( #( 1 2 3 ) #( 4 5 6 ) #( 7 8 9 ) ).
67+
a tr
68+
"15"
6869
]
6970

7071
{ #category : #'instance creation' }
@@ -147,14 +148,21 @@ PMMatrix class >> rows: nRows columns: nCols element: fillElement [
147148

148149
{ #category : #'instance creation' }
149150
PMMatrix class >> rows: aNumberOfRows columns: aNumberOfColumns random: aMaxNumber [
151+
152+
^ self
153+
rows: aNumberOfRows
154+
columns: aNumberOfColumns
155+
random: aMaxNumber
156+
generator: Random new
157+
]
158+
159+
{ #category : #'instance creation' }
160+
PMMatrix class >> rows: aNumberOfRows columns: aNumberOfColumns random: aMaxNumber generator: aGenerator [
150161
"Answer a new Matrix of the given dimensions filled with random numbers"
151-
| random rows |
152-
random := Random new.
153-
154-
rows := (1 to: aNumberOfRows) collect: [ :i |
155-
(1 to: aNumberOfColumns) collect: [ :j |
156-
random nextBetween: 0 and: aMaxNumber ] ].
157-
162+
163+
| rows |
164+
rows := (1 to: aNumberOfRows) collect: [ :i | (1 to: aNumberOfColumns) collect: [ :j | aGenerator nextBetween: 0 and: aMaxNumber ] ].
165+
158166
^ self rows: rows
159167
]
160168

0 commit comments

Comments
 (0)