Skip to content

Commit 13e79d8

Browse files
committed
Add tests for linear algebra routines
1 parent 6882036 commit 13e79d8

File tree

1 file changed

+128
-0
lines changed

1 file changed

+128
-0
lines changed

test/test-linalg.js

Lines changed: 128 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,128 @@
1+
var st = require("../statkit.js")
2+
, tape = require("tape")
3+
4+
tape.Test.prototype.nearequal = function (a, b, tol, msg, extra) {
5+
var r;
6+
if (b === 0.0) {
7+
r = Math.abs(a) < tol;
8+
} else {
9+
r = (a - b) / b < tol;
10+
}
11+
this._assert(r, {
12+
message : msg,
13+
operator : 'near equal',
14+
actual : a,
15+
expected : b,
16+
extra : extra
17+
});
18+
};
19+
20+
tape("linalg", function(t) {
21+
22+
function hilbert(n) {
23+
var A = new Array(n*n);
24+
for (var i = 0; i < n; ++i) {
25+
for (var j = 0; j < n; ++j) {
26+
A[n*i + j] = 1.0/(i+j+1.0);
27+
}
28+
}
29+
return A;
30+
}
31+
32+
function vandermonde(n) {
33+
var A = new Array(n*n);
34+
for(var i = 0; i < n; ++i) {
35+
for(var j = 0; j < n; ++j) {
36+
A[n*i + j] = Math.pow(i + 1.0, n - j - 1.0);
37+
}
38+
}
39+
return A;
40+
}
41+
42+
function rhs(n) {
43+
var b = new Array(n);
44+
for (var i = 0; i < n; ++i) {
45+
b[i] = i + 1;
46+
}
47+
return b;
48+
}
49+
50+
var hilb2 = hilbert(2);
51+
var hilb3 = hilbert(3);
52+
var hilb4 = hilbert(4);
53+
var hilb12 = hilbert(12);
54+
55+
var hilb2_rhs = rhs(2);
56+
var hilb3_rhs = rhs(3);
57+
var hilb4_rhs = rhs(4);
58+
var hilb12_rhs = rhs(12);
59+
60+
var hilb2_solution = [-8.0, 18.0];
61+
var hilb3_solution = [27.0, -192.0, 210.0];
62+
var hilb4_solution = [-64.0, 900.0, -2520.0, 1820.0];
63+
var hilb12_solution = [-1728.0, 245388.0, -8528520.0,
64+
127026900.0, -1009008000.0, 4768571808.0,
65+
-14202796608.0, 27336497760.0, -33921201600.0,
66+
26189163000.0, -11437874448.0, 2157916488.0 ];
67+
68+
var vander2 = vandermonde(2);
69+
var vander3 = vandermonde(3);
70+
var vander4 = vandermonde(4);
71+
var vander12 = vandermonde(12);
72+
73+
var vander2_rhs = rhs(2);
74+
var vander3_rhs = rhs(3);
75+
var vander4_rhs = rhs(4);
76+
var vander12_rhs = rhs(12);
77+
78+
var vander2_solution = [1.0, 0.0];
79+
var vander3_solution = [0.0, 1.0, 0.0];
80+
var vander4_solution = [0.0, 0.0, 1.0, 0.0];
81+
var vander12_solution = [0.0, 0.0, 0.0, 0.0,
82+
0.0, 0.0, 0.0, 0.0,
83+
0.0, 0.0, 1.0, 0.0];
84+
85+
var eps = 2.2204460492503131e-16;
86+
87+
function lu_test(A, b, x, n, tol, msg) {
88+
Ac = A.slice(0);
89+
bc = b.slice(0);
90+
res = st.lufactor(Ac, n);
91+
st.lusolve(Ac, res[1], bc);
92+
for (var i = 0; i < n; ++i) {
93+
t.nearequal(bc[i], x[i], tol, msg + "-" + i);
94+
}
95+
}
96+
97+
lu_test(hilb2, hilb2_rhs, hilb2_solution, 2, 8 * eps, "lu-hilb2");
98+
lu_test(hilb3, hilb3_rhs, hilb3_solution, 3, 64 * eps, "lu-hilb3");
99+
lu_test(hilb4, hilb4_rhs, hilb4_solution, 4, 1024 * eps, "lu-hilb4");
100+
lu_test(hilb12, hilb12_rhs, hilb12_solution, 12, 0.5, "lu-hilb12");
101+
102+
lu_test(vander2, vander2_rhs, vander2_solution, 2, 8.0 * eps, "lu-vander2");
103+
lu_test(vander3, vander3_rhs, vander3_solution, 3, 64.0 * eps, "lu-vander3");
104+
lu_test(vander4, vander4_rhs, vander4_solution, 4, 1024.0 * eps, "lu-vander4");
105+
lu_test(vander12, vander12_rhs, vander12_solution, 12, 0.05, "lu-vander12");
106+
107+
function qr_test(A, b, x, n, tol, msg) {
108+
Ac = A.slice(0);
109+
bc = b.slice(0);
110+
tau = st.qrfactor(n, n, Ac);
111+
st.qrsolve(n, n, Ac, tau, bc);
112+
for (var i = 0; i < n; ++i) {
113+
t.nearequal(bc[i], x[i], tol, msg + "-" + i);
114+
}
115+
}
116+
117+
qr_test(hilb2, hilb2_rhs, hilb2_solution, 2, 8 * eps, 'qr-hilb2');
118+
qr_test(hilb3, hilb3_rhs, hilb3_solution, 3, 64 * eps, 'qr-hilb3');
119+
qr_test(hilb4, hilb4_rhs, hilb4_solution, 4, 1024 * eps, 'qr-hilb4');
120+
qr_test(hilb12, hilb12_rhs, hilb12_solution, 12, 0.5, 'qr-hilb12');
121+
122+
qr_test(vander2, vander2_rhs, vander2_solution, 2, 8.0 * eps, "qr-vander2");
123+
qr_test(vander3, vander3_rhs, vander3_solution, 3, 64.0 * eps, "qr-vander3");
124+
qr_test(vander4, vander4_rhs, vander4_solution, 4, 1024.0 * eps, "qr-vander4");
125+
qr_test(vander12, vander12_rhs, vander12_solution, 12, 0.05, "qr-vander12");
126+
127+
t.end()
128+
})

0 commit comments

Comments
 (0)