[FLINK-1718] [ml] Unifies existing test cases This closes #539.
Project: http://git-wip-us.apache.org/repos/asf/flink/repo Commit: http://git-wip-us.apache.org/repos/asf/flink/commit/d2e2d79f Tree: http://git-wip-us.apache.org/repos/asf/flink/tree/d2e2d79f Diff: http://git-wip-us.apache.org/repos/asf/flink/diff/d2e2d79f Branch: refs/heads/master Commit: d2e2d79fc0052c064188940520c93bbd0c1b1d4b Parents: 5ddb2dd Author: Till Rohrmann <trohrm...@apache.org> Authored: Tue Mar 31 17:01:12 2015 +0200 Committer: Till Rohrmann <trohrm...@apache.org> Committed: Wed Apr 1 10:56:57 2015 +0200 ---------------------------------------------------------------------- .../apache/flink/ml/math/BreezeMathSuite.scala | 68 ++++++++++ .../apache/flink/ml/math/BreezeMathTest.scala | 69 ----------- .../apache/flink/ml/math/DenseMatrixSuite.scala | 86 +++++++++++++ .../apache/flink/ml/math/DenseMatrixTest.scala | 89 ------------- .../apache/flink/ml/math/DenseVectorSuite.scala | 50 ++++++++ .../apache/flink/ml/math/DenseVectorTest.scala | 52 -------- .../flink/ml/math/SparseMatrixSuite.scala | 121 ++++++++++++++++++ .../apache/flink/ml/math/SparseMatrixTest.scala | 124 ------------------- .../flink/ml/math/SparseVectorSuite.scala | 90 ++++++++++++++ .../apache/flink/ml/math/SparseVectorTest.scala | 93 -------------- 10 files changed, 415 insertions(+), 427 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/flink/blob/d2e2d79f/flink-staging/flink-ml/src/test/scala/org/apache/flink/ml/math/BreezeMathSuite.scala ---------------------------------------------------------------------- diff --git a/flink-staging/flink-ml/src/test/scala/org/apache/flink/ml/math/BreezeMathSuite.scala b/flink-staging/flink-ml/src/test/scala/org/apache/flink/ml/math/BreezeMathSuite.scala new file mode 100644 index 0000000..b03f08f --- /dev/null +++ b/flink-staging/flink-ml/src/test/scala/org/apache/flink/ml/math/BreezeMathSuite.scala @@ -0,0 +1,68 @@ +/* + * 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.flink.ml.math + +import Breeze._ + +import org.scalatest.{Matchers, FlatSpec} + +class BreezeMathSuite extends FlatSpec with Matchers { + + behavior of "Breeze vector conversion" + + it should "convert a DenseMatrix into breeze.linalg.DenseMatrix and vice versa" in { + val numRows = 5 + val numCols = 4 + + val data = Array.range(0, numRows * numCols) + val expectedData = Array.range(0, numRows * numCols).map(_ * 2) + + val denseMatrix = DenseMatrix(numRows, numCols, data) + val expectedMatrix = DenseMatrix(numRows, numCols, expectedData) + + val m = denseMatrix.asBreeze + + val result = (m * 2.0).fromBreeze + + result should equal(expectedMatrix) + } + + it should "convert a SparseMatrix into breeze.linalg.CSCMatrix" in { + val numRows = 5 + val numCols = 4 + + val sparseMatrix = SparseMatrix.fromCOO(numRows, numCols, + (0, 1, 1), + (4, 3, 13), + (3, 2, 45), + (4, 0, 12)) + + val expectedMatrix = SparseMatrix.fromCOO(numRows, numCols, + (0, 1, 2), + (4, 3, 26), + (3, 2, 90), + (4, 0, 24)) + + val sm = sparseMatrix.asBreeze + + val result = (sm * 2.0).fromBreeze + + result should equal(expectedMatrix) + } +} http://git-wip-us.apache.org/repos/asf/flink/blob/d2e2d79f/flink-staging/flink-ml/src/test/scala/org/apache/flink/ml/math/BreezeMathTest.scala ---------------------------------------------------------------------- diff --git a/flink-staging/flink-ml/src/test/scala/org/apache/flink/ml/math/BreezeMathTest.scala b/flink-staging/flink-ml/src/test/scala/org/apache/flink/ml/math/BreezeMathTest.scala deleted file mode 100644 index 7084f2a..0000000 --- a/flink-staging/flink-ml/src/test/scala/org/apache/flink/ml/math/BreezeMathTest.scala +++ /dev/null @@ -1,69 +0,0 @@ -/* - * 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.flink.ml.math - -import Breeze._ - -import org.junit.Test -import org.scalatest.ShouldMatchers - -class BreezeMathTest extends ShouldMatchers { - - @Test - def testBreezeDenseMatrixWrapping: Unit = { - val numRows = 5 - val numCols = 4 - - val data = Array.range(0, numRows * numCols) - val expectedData = Array.range(0, numRows * numCols).map(_ * 2) - - val denseMatrix = DenseMatrix(numRows, numCols, data) - val expectedMatrix = DenseMatrix(numRows, numCols, expectedData) - - val m = denseMatrix.asBreeze - - val result = (m * 2.0).fromBreeze - - result should equal(expectedMatrix) - } - - @Test - def testBreezeSparseMatrixWrapping: Unit = { - val numRows = 5 - val numCols = 4 - - val sparseMatrix = SparseMatrix.fromCOO(numRows, numCols, - (0, 1, 1), - (4, 3, 13), - (3, 2, 45), - (4, 0, 12)) - - val expectedMatrix = SparseMatrix.fromCOO(numRows, numCols, - (0, 1, 2), - (4, 3, 26), - (3, 2, 90), - (4, 0, 24)) - - val sm = sparseMatrix.asBreeze - - val result = (sm * 2.0).fromBreeze - - result should equal(expectedMatrix) - } -} http://git-wip-us.apache.org/repos/asf/flink/blob/d2e2d79f/flink-staging/flink-ml/src/test/scala/org/apache/flink/ml/math/DenseMatrixSuite.scala ---------------------------------------------------------------------- diff --git a/flink-staging/flink-ml/src/test/scala/org/apache/flink/ml/math/DenseMatrixSuite.scala b/flink-staging/flink-ml/src/test/scala/org/apache/flink/ml/math/DenseMatrixSuite.scala new file mode 100644 index 0000000..ca3d601 --- /dev/null +++ b/flink-staging/flink-ml/src/test/scala/org/apache/flink/ml/math/DenseMatrixSuite.scala @@ -0,0 +1,86 @@ +/* + * 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.flink.ml.math + +import org.scalatest.{Matchers, FlatSpec} + +class DenseMatrixSuite extends FlatSpec with Matchers { + + behavior of "Flink's DenseMatrix" + + it should "contain the initialization data" in { + val numRows = 10 + val numCols = 13 + + val data = Array.range(0, numRows*numCols) + + val matrix = DenseMatrix(numRows, numCols, data) + + assertResult(numRows)(matrix.numRows) + assertResult(numCols)(matrix.numCols) + + for(row <- 0 until numRows; col <- 0 until numCols) { + assertResult(data(col*numRows + row))(matrix(row, col)) + } + } + + it should "fail in case of invalid element access" in { + val numRows = 10 + val numCols = 13 + + val matrix = DenseMatrix.zeros(numRows, numCols) + + intercept[IllegalArgumentException] { + matrix(-1, 2) + } + + intercept[IllegalArgumentException] { + matrix(0, -1) + } + + intercept[IllegalArgumentException] { + matrix(numRows, 0) + } + + intercept[IllegalArgumentException] { + matrix(0, numCols) + } + + intercept[IllegalArgumentException] { + matrix(numRows, numCols) + } + } + + it should "be copyable" in { + val numRows = 4 + val numCols = 5 + + val data = Array.range(0, numRows*numCols) + + val denseMatrix = DenseMatrix.apply(numRows, numCols, data) + + val copy = denseMatrix.copy + + denseMatrix should equal(copy) + + copy(0, 0) = 1 + + denseMatrix should not equal(copy) + } +} http://git-wip-us.apache.org/repos/asf/flink/blob/d2e2d79f/flink-staging/flink-ml/src/test/scala/org/apache/flink/ml/math/DenseMatrixTest.scala ---------------------------------------------------------------------- diff --git a/flink-staging/flink-ml/src/test/scala/org/apache/flink/ml/math/DenseMatrixTest.scala b/flink-staging/flink-ml/src/test/scala/org/apache/flink/ml/math/DenseMatrixTest.scala deleted file mode 100644 index 12001fc..0000000 --- a/flink-staging/flink-ml/src/test/scala/org/apache/flink/ml/math/DenseMatrixTest.scala +++ /dev/null @@ -1,89 +0,0 @@ -/* - * 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.flink.ml.math - -import org.junit.Test -import org.scalatest.ShouldMatchers - -class DenseMatrixTest extends ShouldMatchers { - - @Test - def testDataAfterInitialization: Unit = { - val numRows = 10 - val numCols = 13 - - val data = Array.range(0, numRows*numCols) - - val matrix = DenseMatrix(numRows, numCols, data) - - assertResult(numRows)(matrix.numRows) - assertResult(numCols)(matrix.numCols) - - for(row <- 0 until numRows; col <- 0 until numCols) { - assertResult(data(col*numRows + row))(matrix(row, col)) - } - } - - @Test - def testIllegalArgumentExceptionInCaseOfInvalidIndexAccess: Unit = { - val numRows = 10 - val numCols = 13 - - val matrix = DenseMatrix.zeros(numRows, numCols) - - intercept[IllegalArgumentException] { - matrix(-1, 2) - } - - intercept[IllegalArgumentException] { - matrix(0, -1) - } - - intercept[IllegalArgumentException] { - matrix(numRows, 0) - } - - intercept[IllegalArgumentException] { - matrix(0, numCols) - } - - intercept[IllegalArgumentException] { - matrix(numRows, numCols) - } - } - - @Test - def testCopy: Unit = { - val numRows = 4 - val numCols = 5 - - val data = Array.range(0, numRows*numCols) - - val denseMatrix = DenseMatrix.apply(numRows, numCols, data) - - val copy = denseMatrix.copy - - - denseMatrix should equal(copy) - - copy(0, 0) = 1 - - denseMatrix should not equal(copy) - } -} http://git-wip-us.apache.org/repos/asf/flink/blob/d2e2d79f/flink-staging/flink-ml/src/test/scala/org/apache/flink/ml/math/DenseVectorSuite.scala ---------------------------------------------------------------------- diff --git a/flink-staging/flink-ml/src/test/scala/org/apache/flink/ml/math/DenseVectorSuite.scala b/flink-staging/flink-ml/src/test/scala/org/apache/flink/ml/math/DenseVectorSuite.scala new file mode 100644 index 0000000..553f672 --- /dev/null +++ b/flink-staging/flink-ml/src/test/scala/org/apache/flink/ml/math/DenseVectorSuite.scala @@ -0,0 +1,50 @@ +/* + * 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.flink.ml.math + +import org.scalatest.{Matchers, FlatSpec} + +class DenseVectorSuite extends FlatSpec with Matchers { + + behavior of "Flink's DenseVector" + + it should "contain the initialization data" in { + val data = Array.range(1,10) + + val vector = DenseVector(data) + + assertResult(data.length)(vector.size) + + data.zip(vector.map(_._2)).foreach{case (expected, actual) => assertResult(expected)(actual)} + } + + it should "fail in case of an illegal element access" in { + val size = 10 + + val vector = DenseVector.zeros(size) + + intercept[IllegalArgumentException] { + vector(-1) + } + + intercept[IllegalArgumentException] { + vector(size) + } + } +} http://git-wip-us.apache.org/repos/asf/flink/blob/d2e2d79f/flink-staging/flink-ml/src/test/scala/org/apache/flink/ml/math/DenseVectorTest.scala ---------------------------------------------------------------------- diff --git a/flink-staging/flink-ml/src/test/scala/org/apache/flink/ml/math/DenseVectorTest.scala b/flink-staging/flink-ml/src/test/scala/org/apache/flink/ml/math/DenseVectorTest.scala deleted file mode 100644 index 66a51fe..0000000 --- a/flink-staging/flink-ml/src/test/scala/org/apache/flink/ml/math/DenseVectorTest.scala +++ /dev/null @@ -1,52 +0,0 @@ -/* - * 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.flink.ml.math - -import org.junit.Test -import org.scalatest.ShouldMatchers - - -class DenseVectorTest extends ShouldMatchers { - - @Test - def testDataAfterInitialization { - val data = Array.range(1,10) - - val vector = DenseVector(data) - - assertResult(data.length)(vector.size) - - data.zip(vector.map(_._2)).foreach{case (expected, actual) => assertResult(expected)(actual)} - } - - @Test - def testIllegalArgumentExceptionInCaseOfIllegalIndexAccess { - val size = 10 - - val vector = DenseVector.zeros(size) - - intercept[IllegalArgumentException] { - vector(-1) - } - - intercept[IllegalArgumentException] { - vector(size) - } - } -} http://git-wip-us.apache.org/repos/asf/flink/blob/d2e2d79f/flink-staging/flink-ml/src/test/scala/org/apache/flink/ml/math/SparseMatrixSuite.scala ---------------------------------------------------------------------- diff --git a/flink-staging/flink-ml/src/test/scala/org/apache/flink/ml/math/SparseMatrixSuite.scala b/flink-staging/flink-ml/src/test/scala/org/apache/flink/ml/math/SparseMatrixSuite.scala new file mode 100644 index 0000000..5710931 --- /dev/null +++ b/flink-staging/flink-ml/src/test/scala/org/apache/flink/ml/math/SparseMatrixSuite.scala @@ -0,0 +1,121 @@ +/* + * 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.flink.ml.math + +import org.scalatest.{Matchers, FlatSpec} + +class SparseMatrixSuite extends FlatSpec with Matchers { + + behavior of "Flink's SparseMatrix" + + it should "be initialized from a coordinate list representation (COO)" in { + val data = List[(Int, Int, Double)]((0, 0, 0), (0, 1, 0), (3, 4, 43), (2, 1, 17), + (3, 3, 88), (4 , 2, 99), (1, 4, 91), (3, 4, -1)) + + val numRows = 5 + val numCols = 5 + + val sparseMatrix = SparseMatrix.fromCOO(numRows, numCols, data) + + val expectedSparseMatrix = SparseMatrix.fromCOO(5, 5, (3, 4, 42), (2, 1, 17), (3, 3, 88), + (4, 2, 99), (1, 4, 91)) + + val expectedDenseMatrix = DenseMatrix.zeros(5, 5) + expectedDenseMatrix(3, 4) = 42 + expectedDenseMatrix(2, 1) = 17 + expectedDenseMatrix(3, 3) = 88 + expectedDenseMatrix(4, 2) = 99 + expectedDenseMatrix(1, 4) = 91 + + sparseMatrix should equal(expectedSparseMatrix) + sparseMatrix should equal(expectedDenseMatrix) + + sparseMatrix.toDenseMatrix.data.sameElements(expectedDenseMatrix.data) should be(true) + + val dataMap = data. + map{ case (row, col, value) => (row, col) -> value }. + groupBy{_._1}. + mapValues{ + entries => + entries.map(_._2).reduce(_ + _) + } + + for(row <- 0 until numRows; col <- 0 until numCols) { + sparseMatrix(row, col) should be(dataMap.getOrElse((row, col), 0)) + } + + // test access to defined field even though it was set to 0 + sparseMatrix(0, 1) = 10 + + // test that a non-defined field is not accessible + intercept[IllegalArgumentException]{ + sparseMatrix(1, 1) = 1 + } + } + + it should "fail when accessing zero elements or using invalid indices" in { + val data = List[(Int, Int, Double)]((0, 0, 0), (0, 1, 0), (3, 4, 43), (2, 1, 17), + (3, 3, 88), (4 , 2, 99), (1, 4, 91), (3, 4, -1)) + + val numRows = 5 + val numCols = 5 + + val sparseMatrix = SparseMatrix.fromCOO(numRows, numCols, data) + + intercept[IllegalArgumentException] { + sparseMatrix(-1, 4) + } + + intercept[IllegalArgumentException] { + sparseMatrix(numRows, 0) + } + + intercept[IllegalArgumentException] { + sparseMatrix(0, numCols) + } + + intercept[IllegalArgumentException] { + sparseMatrix(3, -1) + } + } + + it should "fail when elements of the COO list have invalid indices" in { + intercept[IllegalArgumentException]{ + val sparseMatrix = SparseMatrix.fromCOO(5 ,5, (5, 0, 10), (0, 0, 0), (0, 1, 0), (3, 4, 43), + (2, 1, 17)) + } + + intercept[IllegalArgumentException]{ + val sparseMatrix = SparseMatrix.fromCOO(5, 5, (0, 0, 0), (0, 1, 0), (3, 4, 43), (2, 1, 17), + (-1, 4, 20)) + } + } + + it should "be copyable" in { + val sparseMatrix = SparseMatrix.fromCOO(4, 4, (0, 1, 2), (2, 3, 1), (2, 0, 42), (1, 3, 3)) + + val copy = sparseMatrix.copy + + sparseMatrix should equal(copy) + + copy(2, 3) = 2 + + sparseMatrix should not equal(copy) + } +} http://git-wip-us.apache.org/repos/asf/flink/blob/d2e2d79f/flink-staging/flink-ml/src/test/scala/org/apache/flink/ml/math/SparseMatrixTest.scala ---------------------------------------------------------------------- diff --git a/flink-staging/flink-ml/src/test/scala/org/apache/flink/ml/math/SparseMatrixTest.scala b/flink-staging/flink-ml/src/test/scala/org/apache/flink/ml/math/SparseMatrixTest.scala deleted file mode 100644 index 7fcdf54..0000000 --- a/flink-staging/flink-ml/src/test/scala/org/apache/flink/ml/math/SparseMatrixTest.scala +++ /dev/null @@ -1,124 +0,0 @@ -/* - * 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.flink.ml.math - -import org.junit.Test -import org.scalatest.ShouldMatchers - -class SparseMatrixTest extends ShouldMatchers { - - @Test - def testSparseMatrixFromCOO: Unit = { - val data = List[(Int, Int, Double)]((0, 0, 0), (0, 1, 0), (3, 4, 43), (2, 1, 17), - (3, 3, 88), (4 , 2, 99), (1, 4, 91), (3, 4, -1)) - - val numRows = 5 - val numCols = 5 - - val sparseMatrix = SparseMatrix.fromCOO(numRows, numCols, data) - - val expectedSparseMatrix = SparseMatrix.fromCOO(5, 5, (3, 4, 42), (2, 1, 17), (3, 3, 88), - (4, 2, 99), (1, 4, 91)) - - val expectedDenseMatrix = DenseMatrix.zeros(5, 5) - expectedDenseMatrix(3, 4) = 42 - expectedDenseMatrix(2, 1) = 17 - expectedDenseMatrix(3, 3) = 88 - expectedDenseMatrix(4, 2) = 99 - expectedDenseMatrix(1, 4) = 91 - - sparseMatrix should equal(expectedSparseMatrix) - sparseMatrix should equal(expectedDenseMatrix) - - sparseMatrix.toDenseMatrix.data.sameElements(expectedDenseMatrix.data) should be(true) - - val dataMap = data. - map{ case (row, col, value) => (row, col) -> value }. - groupBy{_._1}. - mapValues{ - entries => - entries.map(_._2).reduce(_ + _) - } - - for(row <- 0 until numRows; col <- 0 until numCols) { - sparseMatrix(row, col) should be(dataMap.getOrElse((row, col), 0)) - } - - // test access to defined field even though it was set to 0 - sparseMatrix(0, 1) = 10 - - // test that a non-defined field is not accessible - intercept[IllegalArgumentException]{ - sparseMatrix(1, 1) = 1 - } - } - - @Test - def testInvalidIndexAccess: Unit = { - val data = List[(Int, Int, Double)]((0, 0, 0), (0, 1, 0), (3, 4, 43), (2, 1, 17), - (3, 3, 88), (4 , 2, 99), (1, 4, 91), (3, 4, -1)) - - val numRows = 5 - val numCols = 5 - - val sparseMatrix = SparseMatrix.fromCOO(numRows, numCols, data) - - intercept[IllegalArgumentException] { - sparseMatrix(-1, 4) - } - - intercept[IllegalArgumentException] { - sparseMatrix(numRows, 0) - } - - intercept[IllegalArgumentException] { - sparseMatrix(0, numCols) - } - - intercept[IllegalArgumentException] { - sparseMatrix(3, -1) - } - } - - @Test - def testSparseMatrixFromCOOWithInvalidIndices: Unit = { - intercept[IllegalArgumentException]{ - val sparseMatrix = SparseMatrix.fromCOO(5 ,5, (5, 0, 10), (0, 0, 0), (0, 1, 0), (3, 4, 43), - (2, 1, 17)) - } - - intercept[IllegalArgumentException]{ - val sparseMatrix = SparseMatrix.fromCOO(5, 5, (0, 0, 0), (0, 1, 0), (3, 4, 43), (2, 1, 17), - (-1, 4, 20)) - } - } - - @Test - def testSparseMatrixCopy: Unit = { - val sparseMatrix = SparseMatrix.fromCOO(4, 4, (0, 1, 2), (2, 3, 1), (2, 0, 42), (1, 3, 3)) - - val copy = sparseMatrix.copy - - sparseMatrix should equal(copy) - - copy(2, 3) = 2 - - sparseMatrix should not equal(copy) - } -} http://git-wip-us.apache.org/repos/asf/flink/blob/d2e2d79f/flink-staging/flink-ml/src/test/scala/org/apache/flink/ml/math/SparseVectorSuite.scala ---------------------------------------------------------------------- diff --git a/flink-staging/flink-ml/src/test/scala/org/apache/flink/ml/math/SparseVectorSuite.scala b/flink-staging/flink-ml/src/test/scala/org/apache/flink/ml/math/SparseVectorSuite.scala new file mode 100644 index 0000000..28415e8 --- /dev/null +++ b/flink-staging/flink-ml/src/test/scala/org/apache/flink/ml/math/SparseVectorSuite.scala @@ -0,0 +1,90 @@ +/* + * 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.flink.ml.math + +import org.scalatest.{Matchers, FlatSpec} + +class SparseVectorSuite extends FlatSpec with Matchers { + + behavior of "Flink's SparseVector" + + it should "contain the initialization data provided as coordinate list (COO)" in { + val data = List[(Int, Double)]((0, 1), (2, 0), (4, 42), (0, 3)) + val size = 5 + val sparseVector = SparseVector.fromCOO(size, data) + + val expectedSparseVector = SparseVector.fromCOO(5, (0, 4), (4, 42)) + val expectedDenseVector = DenseVector.zeros(5) + + expectedDenseVector(0) = 4 + expectedDenseVector(4) = 42 + + sparseVector should equal(expectedSparseVector) + sparseVector should equal(expectedDenseVector) + + val denseVector = sparseVector.toDenseVector + + denseVector should equal(expectedDenseVector) + + val dataMap = data. + groupBy{_._1}. + mapValues{ + entries => + entries.map(_._2).reduce(_ + _) + } + + for(index <- 0 until size) { + sparseVector(index) should be(dataMap.getOrElse(index, 0)) + } + } + + it should "fail when accessing elements using an invalid index" in { + val sparseVector = SparseVector.fromCOO(5, (1, 1), (3, 3), (4, 4)) + + intercept[IllegalArgumentException] { + sparseVector(-1) + } + + intercept[IllegalArgumentException] { + sparseVector(5) + } + } + + it should "fail when the COO list contains elements with invalid indices" in { + intercept[IllegalArgumentException] { + val sparseVector = SparseVector.fromCOO(5, (0, 1), (-1, 34), (3, 2)) + } + + intercept[IllegalArgumentException] { + val sparseVector = SparseVector.fromCOO(5, (0, 1), (4,3), (5, 1)) + } + } + + it should "be copyable" in { + val sparseVector = SparseVector.fromCOO(5, (0, 1), (4, 3), (3, 2)) + + val copy = sparseVector.copy + + sparseVector should equal(copy) + + copy(3) = 3 + + sparseVector should not equal(copy) + } +} http://git-wip-us.apache.org/repos/asf/flink/blob/d2e2d79f/flink-staging/flink-ml/src/test/scala/org/apache/flink/ml/math/SparseVectorTest.scala ---------------------------------------------------------------------- diff --git a/flink-staging/flink-ml/src/test/scala/org/apache/flink/ml/math/SparseVectorTest.scala b/flink-staging/flink-ml/src/test/scala/org/apache/flink/ml/math/SparseVectorTest.scala deleted file mode 100644 index 88d4878..0000000 --- a/flink-staging/flink-ml/src/test/scala/org/apache/flink/ml/math/SparseVectorTest.scala +++ /dev/null @@ -1,93 +0,0 @@ -/* - * 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.flink.ml.math - -import org.junit.Test -import org.scalatest.ShouldMatchers - -class SparseVectorTest extends ShouldMatchers{ - - @Test - def testDataAfterInitialization: Unit = { - val data = List[(Int, Double)]((0, 1), (2, 0), (4, 42), (0, 3)) - val size = 5 - val sparseVector = SparseVector.fromCOO(size, data) - - val expectedSparseVector = SparseVector.fromCOO(5, (0, 4), (4, 42)) - val expectedDenseVector = DenseVector.zeros(5) - - expectedDenseVector(0) = 4 - expectedDenseVector(4) = 42 - - sparseVector should equal(expectedSparseVector) - sparseVector should equal(expectedDenseVector) - - val denseVector = sparseVector.toDenseVector - - denseVector should equal(expectedDenseVector) - - val dataMap = data. - groupBy{_._1}. - mapValues{ - entries => - entries.map(_._2).reduce(_ + _) - } - - for(index <- 0 until size) { - sparseVector(index) should be(dataMap.getOrElse(index, 0)) - } - } - - @Test - def testInvalidIndexAccess: Unit = { - val sparseVector = SparseVector.fromCOO(5, (1, 1), (3, 3), (4, 4)) - - intercept[IllegalArgumentException] { - sparseVector(-1) - } - - intercept[IllegalArgumentException] { - sparseVector(5) - } - } - - @Test - def testSparseVectorFromCOOWithInvalidIndices: Unit = { - intercept[IllegalArgumentException] { - val sparseVector = SparseVector.fromCOO(5, (0, 1), (-1, 34), (3, 2)) - } - - intercept[IllegalArgumentException] { - val sparseVector = SparseVector.fromCOO(5, (0, 1), (4,3), (5, 1)) - } - } - - @Test - def testSparseVectorCopy: Unit = { - val sparseVector = SparseVector.fromCOO(5, (0, 1), (4, 3), (3, 2)) - - val copy = sparseVector.copy - - sparseVector should equal(copy) - - copy(3) = 3 - - sparseVector should not equal(copy) - } -}