Skip to content

Commit ba894ca

Browse files
committed
Add SolverHelper unit tests.
1 parent 1e7ec8b commit ba894ca

File tree

4 files changed

+181
-0
lines changed

4 files changed

+181
-0
lines changed

CSparse.Tests/Complex/Helper.cs

+30
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
namespace CSparse.Tests.Complex
22
{
33
using CSparse.Storage;
4+
using NUnit.Framework;
45
using System.Numerics;
56

67
static class Helper
@@ -25,5 +26,34 @@ public static Complex[] Multiply(Matrix<Complex> A, Complex[] x)
2526

2627
return b;
2728
}
29+
30+
public static Complex[] TransposeMultiply(Matrix<Complex> A, Complex[] x, bool conjugate = true)
31+
{
32+
if (conjugate)
33+
{
34+
var conjA = ((CompressedColumnStorage<Complex>)A).Clone();
35+
var values = conjA.Values;
36+
for (int i = 0; i < values.Length; i++)
37+
{
38+
values[i] = Complex.Conjugate(values[i]);
39+
}
40+
A = conjA;
41+
}
42+
43+
var b = new Complex[A.RowCount];
44+
45+
A.TransposeMultiply(1.0, x, 0.0, b);
46+
47+
return b;
48+
}
49+
50+
public static void AssertEqual(int length, Complex[] x, Complex[] y)
51+
{
52+
for (int i = 0; i < length; i++)
53+
{
54+
Assert.AreEqual(x[i].Real, y[i].Real);
55+
Assert.AreEqual(x[i].Imaginary, y[i].Imaginary);
56+
}
57+
}
2858
}
2959
}
+72
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+

2+
namespace CSparse.Tests.Complex
3+
{
4+
using CSparse.Complex;
5+
using CSparse.Storage;
6+
using NUnit.Framework;
7+
using NUnit.Framework.Internal;
8+
9+
using Complex = System.Numerics.Complex;
10+
11+
[DefaultFloatingPointTolerance(1e-12)]
12+
public class SolverHelperTest
13+
{
14+
private readonly CompressedColumnStorage<Complex> L;
15+
private readonly CompressedColumnStorage<Complex> U;
16+
17+
public SolverHelperTest()
18+
{
19+
var A = ResourceLoader.Get<Complex>("hermitian-40-spd.mat");
20+
21+
L = A.Clone();
22+
L.Keep((i, j, a) => i >= j);
23+
24+
U = A.Clone();
25+
U.Keep((i, j, a) => i <= j);
26+
}
27+
28+
[Test]
29+
public void TestSolveLower()
30+
{
31+
var x = Vector.Create(L.ColumnCount, 1.0);
32+
var b = Helper.Multiply(L, x);
33+
34+
SolverHelper.SolveLower(L, b);
35+
36+
Helper.AssertEqual(L.ColumnCount, x, b);
37+
}
38+
39+
[Test]
40+
public void TestSolveLowerTranspose()
41+
{
42+
var x = Vector.Create(L.ColumnCount, 1.0);
43+
var b = Helper.TransposeMultiply(L, x);
44+
45+
SolverHelper.SolveLowerTranspose(L, b);
46+
47+
Helper.AssertEqual(L.ColumnCount, x, b);
48+
}
49+
50+
[Test]
51+
public void TestSolveUpper()
52+
{
53+
var x = Vector.Create(U.ColumnCount, 1.0);
54+
var b = Helper.Multiply(U, x);
55+
56+
SolverHelper.SolveUpper(U, b);
57+
58+
Helper.AssertEqual(L.ColumnCount, x, b);
59+
}
60+
61+
[Test]
62+
public void TestSolveUpperTranspose()
63+
{
64+
var x = Vector.Create(U.ColumnCount, 1.0);
65+
var b = Helper.TransposeMultiply(U, x);
66+
67+
SolverHelper.SolveUpperTranspose(U, b);
68+
69+
Helper.AssertEqual(L.ColumnCount, x, b);
70+
}
71+
}
72+
}

CSparse.Tests/Double/Helper.cs

+9
Original file line numberDiff line numberDiff line change
@@ -22,5 +22,14 @@ public static double[] Multiply(ILinearOperator<double> A, double[] x)
2222

2323
return b;
2424
}
25+
26+
public static double[] TransposeMultiply(ILinearOperator<double> A, double[] x)
27+
{
28+
var b = new double[A.RowCount];
29+
30+
A.TransposeMultiply(1.0, x, 0.0, b);
31+
32+
return b;
33+
}
2534
}
2635
}
+70
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+

2+
namespace CSparse.Tests.Double
3+
{
4+
using CSparse.Double;
5+
using CSparse.Storage;
6+
using NUnit.Framework;
7+
using NUnit.Framework.Internal;
8+
9+
[DefaultFloatingPointTolerance(1e-12)]
10+
public class SolverHelperTest
11+
{
12+
private readonly CompressedColumnStorage<double> L;
13+
private readonly CompressedColumnStorage<double> U;
14+
15+
public SolverHelperTest()
16+
{
17+
var A = ResourceLoader.Get<double>("symmetric-40-spd.mat");
18+
19+
L = A.Clone();
20+
L.Keep((i, j, a) => i >= j);
21+
22+
U = A.Clone();
23+
U.Keep((i, j, a) => i <= j);
24+
}
25+
26+
[Test]
27+
public void TestSolveLower()
28+
{
29+
var x = Vector.Create(L.ColumnCount, 1.0);
30+
var b = Helper.Multiply(L, x);
31+
32+
SolverHelper.SolveLower(L, b);
33+
34+
CollectionAssert.AreEqual(x, b);
35+
}
36+
37+
[Test]
38+
public void TestSolveLowerTranspose()
39+
{
40+
var x = Vector.Create(L.ColumnCount, 1.0);
41+
var b = Helper.TransposeMultiply(L, x);
42+
43+
SolverHelper.SolveLowerTranspose(L, b);
44+
45+
CollectionAssert.AreEqual(x, b);
46+
}
47+
48+
[Test]
49+
public void TestSolveUpper()
50+
{
51+
var x = Vector.Create(U.ColumnCount, 1.0);
52+
var b = Helper.Multiply(U, x);
53+
54+
SolverHelper.SolveUpper(U, b);
55+
56+
CollectionAssert.AreEqual(x, b);
57+
}
58+
59+
[Test]
60+
public void TestSolveUpperTranspose()
61+
{
62+
var x = Vector.Create(U.ColumnCount, 1.0);
63+
var b = Helper.TransposeMultiply(U, x);
64+
65+
SolverHelper.SolveUpperTranspose(U, b);
66+
67+
CollectionAssert.AreEqual(x, b);
68+
}
69+
}
70+
}

0 commit comments

Comments
 (0)