-
Notifications
You must be signed in to change notification settings - Fork 0
/
lapack_test.go
149 lines (122 loc) · 4.5 KB
/
lapack_test.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
package lapack
import (
"testing"
"github.com/ready-steady/assert"
"github.com/ready-steady/fixture"
)
func init() {
SetNumberOfThreads(1)
}
func BenchmarkDSYEV(bench *testing.B) {
n := 1000
a := fixture.MakeSymmetricMatrix(uint(n))
w := make([]float64, n)
lwork := 4 * n
work := make([]float64, lwork)
info := 0
bench.ResetTimer()
for i := 0; i < bench.N; i++ {
DSYEV('V', 'U', n, a, n, w, work, lwork, &info)
}
}
func TestDGETRI(t *testing.T) {
n := 3
a := []float64{1, -1, 0, 0, 5, 3, 2, 0, -9}
ipiv := make([]int, n+1)
info := 0
DGETRF(n, n, a, n, ipiv, &info)
assert.Equal(info, 0, t)
lwork := n * n
work := make([]float64, lwork)
DGETRI(n, a, n, ipiv, work, lwork, &info)
assert.Equal(info, 0, t)
expectedA := []float64{
+8.823529411764706e-01, +1.764705882352941e-01, +5.882352941176472e-02,
-1.176470588235294e-01, +1.764705882352941e-01, +5.882352941176472e-02,
+1.960784313725490e-01, +3.921568627450981e-02, -9.803921568627452e-02,
}
assert.Close(a, expectedA, 1e-15, t)
}
func TestDGTSV(t *testing.T) {
n := 10
nrhs := 2
dl := []float64{
4.1702200470257400e-01, 7.2032449344215810e-01, 1.1437481734488664e-04,
3.0233257263183977e-01, 1.4675589081711304e-01, 9.2338594768797799e-02,
1.8626021137767090e-01, 3.4556072704304774e-01, 3.9676747423066994e-01,
}
d := []float64{
1.4191945144032947e+00, 1.6852195003967596e+00, 1.2044522497315175e+00,
1.8781174363909454e+00, 1.0273875931979262e+00, 1.6704675101784021e+00,
1.4173048023671271e+00, 1.5586898284457518e+00, 1.1403869385952339e+00,
1.1981014890848787e+00,
}
du := []float64{
9.6826157571939753e-01, 3.1342417815924284e-01, 6.9232261566931408e-01,
8.7638915229603831e-01, 8.9460666350384732e-01, 8.5044211369777911e-02,
3.9054783232882362e-02, 1.6983041956456890e-01, 8.7814250342941313e-01,
}
b := []float64{
9.8886108890649471e-01, 7.4816565437983940e-01, 2.8044399206440518e-01,
7.8927932845148852e-01, 1.0322600657764203e-01, 4.4789352617590517e-01,
9.0859550309309556e-01, 2.9361414837367950e-01, 2.8777533858634874e-01,
1.3002857211827767e-01, 1.9366957870297075e-02, 6.7883553293989096e-01,
2.1162811600005904e-01, 2.6554665937222621e-01, 4.9157315928033829e-01,
5.3362545117080384e-02, 5.7411760549201307e-01, 1.4672857490581015e-01,
5.8930553690328424e-01, 6.9975836002093117e-01,
}
info := 0
DGTSV(n, nrhs, dl, d, du, b, n, &info)
assert.Equal(info, 0, t)
expectedB := []float64{
+4.2413660994635355e-01, +3.9961178716148082e-01, -3.2589132682920774e-01,
+5.5626432959857730e-01, -2.9143803729175111e-01, +2.6209172590772878e-01,
+6.2141868670421718e-01, +9.3577077457946675e-02, +1.8848763199672364e-01,
+4.6108623476807969e-02, -3.2256530997806154e-01, +4.9279026276907484e-01,
-5.4582244963076967e-02, -1.1208513329599634e-01, +5.4320839567983115e-01,
-3.6469011007728362e-02, +4.0642167843987542e-01, +3.7427069391596034e-02,
+7.4728631269099247e-02, +5.5930860268891813e-01,
}
assert.Close(b, expectedB, 1e-15, t)
}
func TestDSYEV(t *testing.T) {
n := 5
a := []float64{
0.162182308193243, 0.601981941401637, 0.450541598502498,
0.825816977489547, 0.106652770180584, 0.601981941401637,
0.262971284540144, 0.083821377996933, 0.538342435260057,
0.961898080855054, 0.450541598502498, 0.083821377996933,
0.228976968716819, 0.996134716626885, 0.004634224134067,
0.825816977489547, 0.538342435260057, 0.996134716626885,
0.078175528753184, 0.774910464711502, 0.106652770180584,
0.961898080855054, 0.004634224134067, 0.774910464711502,
0.817303220653433,
}
w := make([]float64, n)
work := []float64{0}
lwork := -1
info := 0
DSYEV('V', 'U', n, a, n, w, work, lwork, &info)
assert.Equal(info, 0, t)
lwork = int(work[0])
work = make([]float64, lwork)
DSYEV('V', 'U', n, a, n, w, work, lwork, &info)
assert.Equal(info, 0, t)
expectedA := []float64{
-0.350512137830478, +0.116468084895727, -0.435005782872646,
+0.750503447417042, -0.333303121372602, +0.462361750400701,
-0.693041256027589, -0.409079614137348, +0.219801690292016,
+0.300427221556423, -0.638529696902280, -0.450088584675982,
+0.439292414730346, +0.201686466663592, +0.395025107611391,
-0.330279135877552, +0.306798908225146, -0.590447291483772,
-0.272545278020086, +0.611458248553625, +0.382829428829298,
+0.457628341015560, +0.319089342511548, +0.522946873930437,
+0.518388356797788,
}
expectedW := []float64{
-1.145487871954612, -0.676875725405419, -0.050275996742486,
+0.892450858666551, +2.529798046292787,
}
assert.Close(a, expectedA, 2e-15, t)
assert.Close(w, expectedW, 2e-15, t)
}