using System; using System.Collections.Generic; using System.Linq; using System.Text; using Azimuth.DenseLinearAlgebra; namespace Azimuth.UnitTests.DenseLinearAlgebra { public class LinearLeastSquaresTests_Solve : UnitTestSharp.TestFixture { public class FullRankSquare : UnitTestSharp.TestFixture { public void x11() { var matrix = new RectangularMatrix(new Scalar[,] { { 7 }, }); var input = new DenseVector(new Scalar[] { 28, }); var expected = new DenseVector(new Scalar[] { 4, }); DenseVector output; LinearLeastSquares lls = new LinearLeastSquares(matrix); lls.SolveSystem(out output, input); CheckEqual(expected, output); } public void x22_Triangular() { var matrix = new RectangularMatrix(new Scalar[,] { { 2, 1, }, { 0, 1, }, }); var input = new DenseVector(new Scalar[] { 4, 2, }); var expected = new DenseVector(new Scalar[] { 1, 2, }); DenseVector output; LinearLeastSquares lls = new LinearLeastSquares(matrix); lls.SolveSystem(out output, input); CheckEqual(expected, output); } public void x22() { var matrix = new RectangularMatrix(new Scalar[,] { { 3, 4, }, { 7, 10, }, }); var input = new DenseVector(new Scalar[] { 7, 17, }); var expected = new DenseVector(new Scalar[] { 1, 1, }); DenseVector output; LinearLeastSquares lls = new LinearLeastSquares(matrix); lls.SolveSystem(out output, input); CheckEqual(expected, output); } public void x33_Triangular() { var matrix = new RectangularMatrix(new Scalar[,] { { 4, 2, 1, }, { 0, 2, 1, }, { 0, 0, 1, }, }); var input = new DenseVector(new Scalar[] { 1, 1, 1, }); var expected = new DenseVector(new Scalar[] { 0, 0, 1, }); DenseVector output; LinearLeastSquares lls = new LinearLeastSquares(matrix); lls.SolveSystem(out output, input); CheckEqual(expected, output); } public void x33_A() { var matrix = new RectangularMatrix(new Scalar[,] { { 2, 1, 3, }, {-1, 0, 7, }, { 0, -1, -1, }, }); var input = new DenseVector(new Scalar[] { 1, 1, 1, }); var expected = new DenseVector(new Scalar[] { .75, -1.25, .25, }); DenseVector output; LinearLeastSquares lls = new LinearLeastSquares(matrix); lls.SolveSystem(out output, input); CheckEqual(expected, output); } public void x33() { var matrix = new RectangularMatrix(new Scalar[,] { { 1, 2, 3, }, { 1, 2, 1, }, { 3, 2, 1, }, }); var input = new DenseVector(new Scalar[] { 4, 2, 0, }); var expected = new DenseVector(new Scalar[] { -1, 1, 1, }); DenseVector output; LinearLeastSquares lls = new LinearLeastSquares(matrix); lls.SolveSystem(out output, input); CheckEqual(expected, output); } } public class RankDeficientSquare : UnitTestSharp.TestFixture { public void x22() { var matrix = new RectangularMatrix(new Scalar[,] { { 1, 2, }, { 2, 4, }, }); var input = new DenseVector(new Scalar[] { 1, 1, }); var expected = new DenseVector(new Scalar[] { .12, .24, }); DenseVector output; LinearLeastSquares lls = new LinearLeastSquares(matrix); lls.SolveSystem(out output, input); CheckEqual(expected, output); } public void x33() { var matrix = new RectangularMatrix(new Scalar[,] { { 1, 2, 3, }, { 3, 2, 1, }, { 1, 1, 1, }, }); var input = new DenseVector(new Scalar[] { 1, 1, 1, }); var expected = new DenseVector(new Scalar[] { 1.0/5.4, 1.0/5.4, 1.0/5.4, }); DenseVector output; LinearLeastSquares lls = new LinearLeastSquares(matrix); lls.SolveSystem(out output, input); CheckEqual(expected, output); } } public class FullRankFat : UnitTestSharp.TestFixture { public void x24() { var matrix = new RectangularMatrix(new Scalar[,] { { 1, 2, 3, 4, }, { 4, 3, 2, 1, }, }); var input = new DenseVector(new Scalar[] { 1, 1, }); var expected = new DenseVector(new Scalar[] { .1, .1, .1, .1, }); DenseVector output; LinearLeastSquares lls = new LinearLeastSquares(matrix); lls.SolveSystem(out output, input); CheckEqual(expected, output); } public void x36() { var matrix = new RectangularMatrix(new Scalar[,] { { 1, 2, 3, 4, 5, 6, }, { 6, 5, 4, 3, 2, 1, }, { 1, 2, 2, 2, 2, 1, }, }); var input = new DenseVector(new Scalar[] { 1, 1, 1, }); var expected = new DenseVector(new Scalar[] { -6.0/28.0, 5.0/28.0, 5.0/28.0, 5.0/28.0, 5.0/28.0, -6.0/28.0, }); DenseVector output; LinearLeastSquares lls = new LinearLeastSquares(matrix); lls.SolveSystem(out output, input); CheckEqual(expected, output); } } public class FullRankTall : UnitTestSharp.TestFixture { public void x42() { var matrix = new RectangularMatrix(new Scalar[,] { { 1, 4, }, { 2, 3, }, { 3, 2, }, { 4, 1, }, }); var input = new DenseVector(new Scalar[] { 1, 1, 1, 1, }); var expected = new DenseVector(new Scalar[] { .2, .2, }); DenseVector output; LinearLeastSquares lls = new LinearLeastSquares(matrix); lls.SolveSystem(out output, input); CheckEqual(expected, output); } public void x63() { var matrix = new RectangularMatrix(new Scalar[,] { { 1, 6, 1, }, { 2, 5, 2, }, { 3, 4, 2, }, { 4, 3, 2, }, { 5, 2, 2, }, { 6, 1, 1, }, }); var input = new DenseVector(new Scalar[] { 1, 1, 1, 1, 1, 1, }); var expected = new DenseVector(new Scalar[] { 1.0/7.0, 1.0/7.0, 0, }); DenseVector output; LinearLeastSquares lls = new LinearLeastSquares(matrix); lls.SolveSystem(out output, input); CheckEqual(expected, output); } } public class RankDeficientFat : UnitTestSharp.TestFixture { public void x24() { var matrix = new RectangularMatrix(new Scalar[,] { { 1, 2, 3, 4, }, { 2, 4, 6, 8, }, }); var input = new DenseVector(new Scalar[] { 100, 100, }); var expected = new DenseVector(new Scalar[] { 2, 4, 6, 8, }); DenseVector output; LinearLeastSquares lls = new LinearLeastSquares(matrix); lls.SolveSystem(out output, input); CheckEqual(expected, output); } public void x36() { var matrix = new RectangularMatrix(new Scalar[,] { { 1, 2, 3, 4, 5, 6, }, { 2, 4, 6, 8, 10, 12, }, { 3, 6, 9, 12, 15, 18, }, }); var input = new DenseVector(new Scalar[] { 1, 1, 1, }); var expected = new DenseVector(new Scalar[] { 1 * 3.0/637.0, 2 * 3.0/637.0, 3 * 3.0/637.0, 4 * 3.0/637.0, 5 * 3.0/637.0, 6 * 3.0/637.0, }); DenseVector output; LinearLeastSquares lls = new LinearLeastSquares(matrix); lls.SolveSystem(out output, input); CheckEqual(expected, output); } } public class RankDeficientTall : UnitTestSharp.TestFixture { public void x42() { var matrix = new RectangularMatrix(new Scalar[,] { { 1, 2 }, { 2, 4 }, { 3, 6 }, { 4, 8 }, }); var input = new DenseVector(new Scalar[] { 4, 3, 2, 1, }); var expected = new DenseVector(new Scalar[] { 1.0/7.5, 1.0/3.75, }); DenseVector output; LinearLeastSquares lls = new LinearLeastSquares(matrix); lls.SolveSystem(out output, input); CheckEqual(expected, output); } public void x63() { var matrix = new RectangularMatrix(new Scalar[,] { { 1, 2, 3, }, { 2, 4, 6, }, { 3, 6, 9, }, { 4, 8, 12, }, { 5, 10, 15, }, { 6, 12, 18, }, }); var input = new DenseVector(new Scalar[] { 1, 1, 1, 1, 1, 1, }); var expected = new DenseVector(new Scalar[] { 1 * 3.0/182, 2 * 3.0/182, 3 * 3.0/182, }); DenseVector output; LinearLeastSquares lls = new LinearLeastSquares(matrix); lls.SolveSystem(out output, input); CheckEqual(expected, output); } } } public class LinearLeastSquaresTests_SolveWithConstraints : UnitTestSharp.TestFixture { public class NoConstraintsActually : UnitTestSharp.TestFixture { public void x63() { var matrix = new RectangularMatrix(new Scalar[,] { { 1, 2, 3, }, { 2, 4, 6, }, { 3, 6, 9, }, { 4, 8, 12, }, { 5, 10, 15, }, { 6, 12, 18, }, }); var input = new DenseVector(new Scalar[] { 1, 1, 1, 1, 1, 1, }); var expected = new DenseVector(new Scalar[] { 1 * 3.0/182, 2 * 3.0/182, 3 * 3.0/182, }); DenseVector output; LinearLeastSquares lls = new LinearLeastSquares(matrix); Check(lls.SolveSystemWithConstraints(out output, input, new RectangularMatrix(0,matrix.ColumnCount), new DenseVector(0))); CheckEqual(expected, output); } public void x36() { var matrix = new RectangularMatrix(new Scalar[,] { { 1, 2, 3, 4, 5, 6, }, { 2, 4, 6, 8, 10, 12, }, { 3, 6, 9, 12, 15, 18, }, }); var input = new DenseVector(new Scalar[] { 1, 1, 1, }); var expected = new DenseVector(new Scalar[] { 1 * 3.0/637.0, 2 * 3.0/637.0, 3 * 3.0/637.0, 4 * 3.0/637.0, 5 * 3.0/637.0, 6 * 3.0/637.0, }); DenseVector output; LinearLeastSquares lls = new LinearLeastSquares(matrix); Check(lls.SolveSystemWithConstraints(out output, input, new RectangularMatrix(0, matrix.ColumnCount), new DenseVector(0))); CheckEqual(expected, output); } } public class RedundantConstraints : UnitTestSharp.TestFixture { public void x11() { var matrix = new RectangularMatrix(new Scalar[,] { { 1, }, }); var constraints = new RectangularMatrix(new Scalar[,] { { -1, }, { 1, }, }); var h = new DenseVector(new Scalar[] { -2, 0, }); var input = new DenseVector(new Scalar[] { 1, }); var expected = new DenseVector(new Scalar[] { 1, }); DenseVector output; LinearLeastSquares lls = new LinearLeastSquares(matrix); Check(lls.SolveSystemWithConstraints(out output, input, constraints, h)); CheckEqual(expected, output); } public void x36() { var matrix = new RectangularMatrix(new Scalar[,] { { 1, 2, 3, 4, 5, 6, }, { 2, 4, 6, 8, 10, 12, }, { 3, 6, 9, 12, 15, 18, }, }); var constraints = new RectangularMatrix(new Scalar[,] { { -1, 0, 0, 0, 0, 0, }, { 0, -1, 0, 0, 0, 0, }, }); var h = new DenseVector(new Scalar[] { -1, -1, }); var input = new DenseVector(new Scalar[] { 1, 1, 1, }); var expected = new DenseVector(new Scalar[] { 1 * 3.0/637.0, 2 * 3.0/637.0, 3 * 3.0/637.0, 4 * 3.0/637.0, 5 * 3.0/637.0, 6 * 3.0/637.0, }); DenseVector output; LinearLeastSquares lls = new LinearLeastSquares(matrix); Check(lls.SolveSystemWithConstraints(out output, input, constraints, h)); CheckEqual(expected, output); } } public class NonredundantConstraints : UnitTestSharp.TestFixture { public void x11() { var matrix = new RectangularMatrix(new Scalar[,] { { 1, }, }); var constraints = new RectangularMatrix(new Scalar[,] { { -1, }, { 1, }, }); var h = new DenseVector(new Scalar[] { -2, 0, }); var input = new DenseVector(new Scalar[] { 3, }); var expected = new DenseVector(new Scalar[] { 2, }); DenseVector output; LinearLeastSquares lls = new LinearLeastSquares(matrix); Check(lls.SolveSystemWithConstraints(out output, input, constraints, h)); CheckEqual(expected, output); } public void x22() { var matrix = new RectangularMatrix(new Scalar[,] { { 1, 0, }, { 0, 1, }, }); var constraints = new RectangularMatrix(new Scalar[,] { { -1, 0, }, { 1, 0, }, { 0, -1, }, { 0, 1, }, }); var h = new DenseVector(new Scalar[] { -2, 0, -2, 0, }); var input = new DenseVector(new Scalar[] { 3, -3, }); var expected = new DenseVector(new Scalar[] { 2, 0, }); DenseVector output; LinearLeastSquares lls = new LinearLeastSquares(matrix); Check(lls.SolveSystemWithConstraints(out output, input, constraints, h)); CheckEqual(expected, output); } public void x33() { var matrix = new RectangularMatrix(new Scalar[,] { { 0, 0, 1, }, { 0, 1, 0, }, { 1, 0, 0, }, }); var constraints = new RectangularMatrix(new Scalar[,] { { -1, 0, 0, }, { 1, 0, 0, }, { 0, -1, 0, }, { 0, 1, 0, }, }); var h = new DenseVector(new Scalar[] { -2, 0, -2, 0, }); var input = new DenseVector(new Scalar[] { 3, -3, 3, }); var expected = new DenseVector(new Scalar[] { 2, 0, 3, }); DenseVector output; LinearLeastSquares lls = new LinearLeastSquares(matrix); Check(lls.SolveSystemWithConstraints(out output, input, constraints, h)); CheckEqual(expected, output); } } public class BadSizes : UnitTestSharp.TestFixture { public void BadSizeForG() { var matrix = new RectangularMatrix(new Scalar[,] { { 0, 0, 1, }, { 0, 1, 0, }, { 1, 0, 0, }, }); var constraints = new RectangularMatrix(new Scalar[,] { { -1, }, { 1, }, }); var h = new DenseVector(new Scalar[] { -2, -2, }); var input = new DenseVector(new Scalar[] { 3, -3, 3, }); DenseVector output; LinearLeastSquares lls = new LinearLeastSquares(matrix); CheckThrow(typeof(Exception)); lls.SolveSystemWithConstraints(out output, input, constraints, h); } public void BadSizeForH() { var matrix = new RectangularMatrix(new Scalar[,] { { 0, 0, 1, }, { 0, 1, 0, }, { 1, 0, 0, }, }); var constraints = new RectangularMatrix(new Scalar[,] { { -1, 0, 0, }, { 1, 0, 0, }, }); var h = new DenseVector(new Scalar[] { -2, -2, 3, }); var input = new DenseVector(new Scalar[] { 3, -3, 3, }); DenseVector output; LinearLeastSquares lls = new LinearLeastSquares(matrix); CheckThrow(typeof(Exception)); lls.SolveSystemWithConstraints(out output, input, constraints, h); } public void BadSizeForInput() { var matrix = new RectangularMatrix(new Scalar[,] { { 0, 0, 1, }, { 0, 1, 0, }, { 1, 0, 0, }, }); var constraints = new RectangularMatrix(new Scalar[,] { { -1, 0, 0, }, { 1, 0, 0, }, }); var h = new DenseVector(new Scalar[] { -2, -2, }); var input = new DenseVector(new Scalar[] { 3, -3, }); DenseVector output; LinearLeastSquares lls = new LinearLeastSquares(matrix); CheckThrow(typeof(Exception)); lls.SolveSystemWithConstraints(out output, input, constraints, h); } } public class InconsistentConstraints : UnitTestSharp.TestFixture { public void x11() { var matrix = new RectangularMatrix(new Scalar[,] { { 1, }, }); var constraints = new RectangularMatrix(new Scalar[,] { { 1, }, { -1, }, }); var h = new DenseVector(new Scalar[] { 2, 0, }); var input = new DenseVector(new Scalar[] { 3, }); DenseVector expected = null; DenseVector output; LinearLeastSquares lls = new LinearLeastSquares(matrix); CheckFalse(lls.SolveSystemWithConstraints(out output, input, constraints, h)); CheckEqual(expected, output); } public void x22() { var matrix = new RectangularMatrix(new Scalar[,] { { 1, 0, }, { 0, 1, }, }); var constraints = new RectangularMatrix(new Scalar[,] { { 1, 0, }, { -1, 0, }, }); var h = new DenseVector(new Scalar[] { 2, 0, }); var input = new DenseVector(new Scalar[] { 3, 2, }); DenseVector expected = null; DenseVector output; LinearLeastSquares lls = new LinearLeastSquares(matrix); CheckFalse(lls.SolveSystemWithConstraints(out output, input, constraints, h)); CheckEqual(expected, output); } public void x33() { var matrix = new RectangularMatrix(new Scalar[,] { { 1, 0, 0, }, { 0, 1, 0, }, { 0, 0, 1, }, }); var constraints = new RectangularMatrix(new Scalar[,] { { 1, 0, 0, }, { -1, 0, 0, }, }); var h = new DenseVector(new Scalar[] { 2, 0, }); var input = new DenseVector(new Scalar[] { 3, 2, 1, }); DenseVector expected = null; DenseVector output; LinearLeastSquares lls = new LinearLeastSquares(matrix); CheckFalse(lls.SolveSystemWithConstraints(out output, input, constraints, h)); CheckEqual(expected, output); } } } }