| /* |
| * Licensed to the Apache Software Foundation (ASF) under one or more |
| * contributor license agreements. See the NOTICE file distributed with |
| * this work for additional information regarding copyright ownership. |
| * The ASF licenses this file to You under the Apache License, Version 2.0 |
| * (the "License"); you may not use this file except in compliance with |
| * the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| package org.apache.commons.math4.linear; |
| |
| import java.text.NumberFormat; |
| import java.text.ParsePosition; |
| import java.util.Locale; |
| |
| import org.junit.Ignore; |
| import org.junit.Test; |
| import org.junit.Assert; |
| import org.apache.commons.math4.exception.MathParseException; |
| import org.apache.commons.math4.linear.MatrixUtils; |
| import org.apache.commons.math4.linear.RealMatrix; |
| import org.apache.commons.math4.linear.RealMatrixFormat; |
| |
| public abstract class RealMatrixFormatAbstractTest { |
| |
| RealMatrixFormat realMatrixFormat = null; |
| RealMatrixFormat realMatrixFormatOctave = null; |
| |
| protected abstract Locale getLocale(); |
| |
| protected abstract char getDecimalCharacter(); |
| |
| public RealMatrixFormatAbstractTest() { |
| realMatrixFormat = RealMatrixFormat.getInstance(getLocale()); |
| final NumberFormat nf = NumberFormat.getInstance(getLocale()); |
| nf.setMaximumFractionDigits(2); |
| realMatrixFormatOctave = new RealMatrixFormat("[", "]", "", "", "; ", ", ", nf); |
| } |
| |
| @Test |
| public void testSimpleNoDecimals() { |
| RealMatrix m = MatrixUtils.createRealMatrix(new double[][] {{1, 1, 1}, {1, 1, 1}}); |
| String expected = "{{1,1,1},{1,1,1}}"; |
| String actual = realMatrixFormat.format(m); |
| Assert.assertEquals(expected, actual); |
| } |
| |
| @Test |
| public void testSimpleWithDecimals() { |
| RealMatrix m = MatrixUtils.createRealMatrix(new double[][] {{1.23, 1.43, 1.63}, {2.46, 2.46, 2.66}}); |
| String expected = |
| "{{1" + getDecimalCharacter() + |
| "23,1" + getDecimalCharacter() + |
| "43,1" + getDecimalCharacter() + |
| "63},{2" + getDecimalCharacter() + |
| "46,2" + getDecimalCharacter() + |
| "46,2" + getDecimalCharacter() + |
| "66}}"; |
| String actual = realMatrixFormat.format(m); |
| Assert.assertEquals(expected, actual); |
| } |
| |
| @Test |
| public void testSimpleWithDecimalsTrunc() { |
| RealMatrix m = MatrixUtils.createRealMatrix(new double[][] {{1.232323232323, 1.43, 1.63}, |
| {2.46, 2.46, 2.666666666666}}); |
| String expected = |
| "{{1" + getDecimalCharacter() + |
| "2323232323,1" + getDecimalCharacter() + |
| "43,1" + getDecimalCharacter() + |
| "63},{2" + getDecimalCharacter() + |
| "46,2" + getDecimalCharacter() + |
| "46,2" + getDecimalCharacter() + |
| "6666666667}}"; |
| String actual = realMatrixFormat.format(m); |
| Assert.assertEquals(expected, actual); |
| } |
| |
| @Test |
| public void testNegativeComponent() { |
| RealMatrix m = MatrixUtils.createRealMatrix(new double[][] {{-1.232323232323, 1.43, 1.63}, |
| {2.46, 2.46, 2.66}}); |
| String expected = |
| "{{-1" + getDecimalCharacter() + |
| "2323232323,1" + getDecimalCharacter() + |
| "43,1" + getDecimalCharacter() + |
| "63},{2" + getDecimalCharacter() + |
| "46,2" + getDecimalCharacter() + |
| "46,2" + getDecimalCharacter() + |
| "66}}"; |
| String actual = realMatrixFormat.format(m); |
| Assert.assertEquals(expected, actual); |
| } |
| |
| @Test |
| public void testNegativeComponent2() { |
| RealMatrix m = MatrixUtils.createRealMatrix(new double[][] {{1.23, -1.434343434343, 1.63}, |
| {2.46, 2.46, 2.66}}); |
| String expected = |
| "{{1" + getDecimalCharacter() + |
| "23,-1" + getDecimalCharacter() + |
| "4343434343,1" + getDecimalCharacter() + |
| "63},{2" + getDecimalCharacter() + |
| "46,2" + getDecimalCharacter() + |
| "46,2" + getDecimalCharacter() + |
| "66}}"; |
| String actual = realMatrixFormat.format(m); |
| Assert.assertEquals(expected, actual); |
| } |
| |
| @Test |
| public void testNegativeSecondRow() { |
| RealMatrix m = MatrixUtils.createRealMatrix(new double[][] {{1.23, 1.43, 1.63}, |
| {-2.66666666666, 2.46, 2.66}}); |
| String expected = |
| "{{1" + getDecimalCharacter() + |
| "23,1" + getDecimalCharacter() + |
| "43,1" + getDecimalCharacter() + |
| "63},{-2" + getDecimalCharacter() + |
| "6666666667,2" + getDecimalCharacter() + |
| "46,2" + getDecimalCharacter() + |
| "66}}"; |
| String actual = realMatrixFormat.format(m); |
| Assert.assertEquals(expected, actual); |
| } |
| |
| @Test |
| public void testNonDefaultSetting() { |
| RealMatrix m = MatrixUtils.createRealMatrix(new double[][] {{1, 1, 1}, {1, 1, 1}}); |
| String expected = "[1, 1, 1; 1, 1, 1]"; |
| String actual = realMatrixFormatOctave.format(m); |
| Assert.assertEquals(expected, actual); |
| } |
| |
| @Test |
| public void testDefaultFormat() { |
| Locale defaultLocale = Locale.getDefault(); |
| Locale.setDefault(getLocale()); |
| |
| RealMatrix m = MatrixUtils.createRealMatrix(new double[][] {{232.2222222222, -342.33333333333, 432.44444444444}}); |
| String expected = |
| "{{232" + getDecimalCharacter() + |
| "2222222222,-342" + getDecimalCharacter() + |
| "3333333333,432" + getDecimalCharacter() + |
| "4444444444}}"; |
| String actual = (new RealMatrixFormat()).format(m); |
| Assert.assertEquals(expected, actual); |
| |
| Locale.setDefault(defaultLocale); |
| } |
| |
| @Test |
| public void testNan() { |
| RealMatrix m = MatrixUtils.createRealMatrix(new double[][] {{Double.NaN, Double.NaN, Double.NaN}}); |
| String expected = "{{(NaN),(NaN),(NaN)}}"; |
| String actual = realMatrixFormat.format(m); |
| Assert.assertEquals(expected, actual); |
| } |
| |
| @Test |
| public void testPositiveInfinity() { |
| RealMatrix m = MatrixUtils.createRealMatrix( |
| new double[][] {{Double.POSITIVE_INFINITY, Double.POSITIVE_INFINITY, Double.POSITIVE_INFINITY}}); |
| String expected = "{{(Infinity),(Infinity),(Infinity)}}"; |
| String actual = realMatrixFormat.format(m); |
| Assert.assertEquals(expected, actual); |
| } |
| |
| @Test |
| public void tesNegativeInfinity() { |
| RealMatrix m = MatrixUtils.createRealMatrix( |
| new double[][] {{Double.NEGATIVE_INFINITY, Double.NEGATIVE_INFINITY, Double.NEGATIVE_INFINITY}}); |
| String expected = "{{(-Infinity),(-Infinity),(-Infinity)}}"; |
| String actual = realMatrixFormat.format(m); |
| Assert.assertEquals(expected, actual); |
| } |
| |
| @Test |
| public void testParseSimpleNoDecimals() { |
| String source = "{{1, 1, 1}, {1, 1, 1}}"; |
| RealMatrix expected = MatrixUtils.createRealMatrix(new double[][] {{1, 1, 1}, {1, 1, 1}}); |
| RealMatrix actual = realMatrixFormat.parse(source); |
| Assert.assertEquals(expected, actual); |
| } |
| |
| @Test |
| @Ignore |
| public void testParseSimpleWithClosingRowSeparator() { |
| String source = "{{1, 1, 1},{1, 1, 1}, }}"; |
| RealMatrix expected = MatrixUtils.createRealMatrix(new double[][] {{1, 1, 1}, {1, 1, 1}}); |
| RealMatrix actual = realMatrixFormat.parse(source); |
| Assert.assertEquals(expected, actual); |
| } |
| |
| @Test |
| public void testParseIgnoredWhitespace() { |
| RealMatrix expected = MatrixUtils.createRealMatrix(new double[][] {{1, 1, 1}, {1, 1, 1}}); |
| ParsePosition pos1 = new ParsePosition(0); |
| String source1 = "{{1,1,1},{1,1,1}}"; |
| Assert.assertEquals(expected, realMatrixFormat.parse(source1, pos1)); |
| Assert.assertEquals(source1.length(), pos1.getIndex()); |
| ParsePosition pos2 = new ParsePosition(0); |
| String source2 = " { { 1 , 1 , 1 } , { 1 , 1 , 1 } } "; |
| Assert.assertEquals(expected, realMatrixFormat.parse(source2, pos2)); |
| Assert.assertEquals(source2.length() - 1, pos2.getIndex()); |
| } |
| |
| @Test |
| public void testParseSimpleWithDecimals() { |
| String source = |
| "{{1" + getDecimalCharacter() + |
| "23,1" + getDecimalCharacter() + |
| "43,1" + getDecimalCharacter() + |
| "63}}"; |
| RealMatrix expected = MatrixUtils.createRealMatrix(new double[][] {{1.23, 1.43, 1.63}}); |
| RealMatrix actual = realMatrixFormat.parse(source); |
| Assert.assertEquals(expected, actual); |
| } |
| |
| @Test |
| public void testParseSimpleWithDecimalsTrunc() { |
| String source = |
| "{{1" + getDecimalCharacter() + |
| "2323,1" + getDecimalCharacter() + |
| "4343,1" + getDecimalCharacter() + |
| "6333}}"; |
| RealMatrix expected = MatrixUtils.createRealMatrix(new double[][] {{1.2323, 1.4343, 1.6333}}); |
| RealMatrix actual = realMatrixFormat.parse(source); |
| Assert.assertEquals(expected, actual); |
| } |
| |
| @Test |
| public void testParseNegativeComponent() { |
| String source = |
| "{{-1" + getDecimalCharacter() + |
| "2323,1" + getDecimalCharacter() + |
| "4343,1" + getDecimalCharacter() + |
| "6333}}"; |
| RealMatrix expected = MatrixUtils.createRealMatrix(new double[][] {{-1.2323, 1.4343, 1.6333}}); |
| RealMatrix actual = realMatrixFormat.parse(source); |
| Assert.assertEquals(expected, actual); |
| } |
| |
| @Test |
| public void testParseNegativeAll() { |
| String source = |
| "{{-1" + getDecimalCharacter() + |
| "2323,-1" + getDecimalCharacter() + |
| "4343,-1" + getDecimalCharacter() + |
| "6333}}"; |
| RealMatrix expected = MatrixUtils.createRealMatrix(new double[][] {{-1.2323, -1.4343, -1.6333}}); |
| RealMatrix actual = realMatrixFormat.parse(source); |
| Assert.assertEquals(expected, actual); |
| } |
| |
| @Test |
| public void testParseZeroComponent() { |
| String source = |
| "{{0" + getDecimalCharacter() + |
| "0,-1" + getDecimalCharacter() + |
| "4343,1" + getDecimalCharacter() + |
| "6333}}"; |
| RealMatrix expected = MatrixUtils.createRealMatrix(new double[][] {{0.0, -1.4343, 1.6333}}); |
| RealMatrix actual = realMatrixFormat.parse(source); |
| Assert.assertEquals(expected, actual); |
| } |
| |
| @Test |
| public void testParseNonDefaultSetting() { |
| String source = |
| "[1" + getDecimalCharacter() + |
| "2323, 1" + getDecimalCharacter() + |
| "4343, 1" + getDecimalCharacter() + |
| "6333]"; |
| RealMatrix expected = MatrixUtils.createRealMatrix(new double[][] {{1.2323, 1.4343, 1.6333}}); |
| RealMatrix actual = realMatrixFormatOctave.parse(source); |
| Assert.assertEquals(expected, actual); |
| } |
| |
| @Test |
| public void testParseNan() { |
| String source = "{{(NaN), (NaN), (NaN)}}"; |
| RealMatrix actual = realMatrixFormat.parse(source); |
| RealMatrix expected = MatrixUtils.createRealMatrix(new double[][] {{Double.NaN, Double.NaN, Double.NaN}}); |
| for (int i = 0; i < expected.getRowDimension(); i++) { |
| for (int j = 0; j < expected.getColumnDimension(); j++) { |
| Assert.assertTrue(Double.isNaN(actual.getEntry(i, j))); |
| } |
| } |
| } |
| |
| @Test |
| public void testParsePositiveInfinity() { |
| String source = "{{(Infinity), (Infinity), (Infinity)}}"; |
| RealMatrix actual = realMatrixFormat.parse(source); |
| RealMatrix expected = MatrixUtils.createRealMatrix( |
| new double[][] {{Double.POSITIVE_INFINITY, Double.POSITIVE_INFINITY, Double.POSITIVE_INFINITY}}); |
| Assert.assertEquals(expected, actual); |
| } |
| |
| @Test |
| public void testParseNegativeInfinity() { |
| String source = "{{(-Infinity), (-Infinity), (-Infinity)}}"; |
| RealMatrix actual = realMatrixFormat.parse(source); |
| RealMatrix expected = MatrixUtils.createRealMatrix( |
| new double[][] {{Double.NEGATIVE_INFINITY, Double.NEGATIVE_INFINITY, Double.NEGATIVE_INFINITY}}); |
| Assert.assertEquals(expected, actual); |
| } |
| |
| @Test |
| public void testParseNoComponents() { |
| try { |
| realMatrixFormat.parse("{{ }}"); |
| Assert.fail("Expecting MathParseException"); |
| } catch (MathParseException pe) { |
| // expected behavior |
| } |
| } |
| |
| @Test |
| public void testParseManyComponents() { |
| RealMatrix parsed = realMatrixFormat.parse("{{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}}"); |
| Assert.assertEquals(24, parsed.getColumnDimension()); |
| } |
| |
| @Test |
| public void testConstructorSingleFormat() { |
| NumberFormat nf = NumberFormat.getInstance(); |
| RealMatrixFormat mf = new RealMatrixFormat(nf); |
| Assert.assertNotNull(mf); |
| Assert.assertEquals(nf, mf.getFormat()); |
| } |
| |
| @Test |
| public void testForgottenPrefix() { |
| ParsePosition pos = new ParsePosition(0); |
| final String source = "1; 1; 1]"; |
| Assert.assertNull("Should not parse <"+source+">", realMatrixFormat.parse(source, pos)); |
| Assert.assertEquals(0, pos.getErrorIndex()); |
| } |
| |
| @Test |
| public void testForgottenSeparator() { |
| ParsePosition pos = new ParsePosition(0); |
| final String source = "{{1, 1 1}}"; |
| Assert.assertNull("Should not parse <"+source+">", realMatrixFormat.parse(source, pos)); |
| Assert.assertEquals(7, pos.getErrorIndex()); |
| } |
| |
| @Test |
| public void testForgottenSuffix() { |
| ParsePosition pos = new ParsePosition(0); |
| final String source = "{{1, 1, 1 "; |
| Assert.assertNull("Should not parse <"+source+">", realMatrixFormat.parse(source, pos)); |
| Assert.assertEquals(9, pos.getErrorIndex()); |
| } |
| } |