From da46b77afd13df8eb696e4612224ae29cc198c0b Mon Sep 17 00:00:00 2001 From: MechCoder Date: Tue, 20 Oct 2015 16:35:34 -0700 Subject: [SPARK-10082][MLLIB] Validate i, j in apply DenseMatrices and SparseMatrices Given row_ind should be less than the number of rows Given col_ind should be less than the number of cols. The current code in master gives unpredictable behavior for such cases. Author: MechCoder Closes #8271 from MechCoder/hash_code_matrices. --- .../main/scala/org/apache/spark/mllib/linalg/Matrices.scala | 4 ++++ .../scala/org/apache/spark/mllib/linalg/MatricesSuite.scala | 11 +++++++++++ 2 files changed, 15 insertions(+) (limited to 'mllib/src') diff --git a/mllib/src/main/scala/org/apache/spark/mllib/linalg/Matrices.scala b/mllib/src/main/scala/org/apache/spark/mllib/linalg/Matrices.scala index c02ba426fc..cfed9ad073 100644 --- a/mllib/src/main/scala/org/apache/spark/mllib/linalg/Matrices.scala +++ b/mllib/src/main/scala/org/apache/spark/mllib/linalg/Matrices.scala @@ -296,6 +296,8 @@ class DenseMatrix @Since("1.3.0") ( override def apply(i: Int, j: Int): Double = values(index(i, j)) private[mllib] def index(i: Int, j: Int): Int = { + require(i < numRows && i >=0, s"Expected 0 <= i < $numRows, got $i") + require(j < numCols && j >=0, s"Expected 0 <= j < $numCols, got $j") if (!isTransposed) i + numRows * j else j + numCols * i } @@ -570,6 +572,8 @@ class SparseMatrix @Since("1.3.0") ( } private[mllib] def index(i: Int, j: Int): Int = { + require(i < numRows && i >=0, s"Expected 0 <= i < $numRows, got $i") + require(j < numCols && j >=0, s"Expected 0 <= j < $numCols, got $j") if (!isTransposed) { Arrays.binarySearch(rowIndices, colPtrs(j), colPtrs(j + 1), i) } else { diff --git a/mllib/src/test/scala/org/apache/spark/mllib/linalg/MatricesSuite.scala b/mllib/src/test/scala/org/apache/spark/mllib/linalg/MatricesSuite.scala index bfd6d5495f..b0071c9a02 100644 --- a/mllib/src/test/scala/org/apache/spark/mllib/linalg/MatricesSuite.scala +++ b/mllib/src/test/scala/org/apache/spark/mllib/linalg/MatricesSuite.scala @@ -74,6 +74,17 @@ class MatricesSuite extends SparkFunSuite { } } + test("index in matrices incorrect input") { + val sm = Matrices.sparse(3, 2, Array(0, 2, 3), Array(1, 2, 1), Array(0.0, 1.0, 2.0)) + val dm = Matrices.dense(3, 2, Array(0.0, 2.3, 1.4, 3.2, 1.0, 9.1)) + Array(sm, dm).foreach { mat => + intercept[IllegalArgumentException] { mat.index(4, 1) } + intercept[IllegalArgumentException] { mat.index(1, 4) } + intercept[IllegalArgumentException] { mat.index(-1, 2) } + intercept[IllegalArgumentException] { mat.index(1, -2) } + } + } + test("equals") { val dm1 = Matrices.dense(2, 2, Array(0.0, 1.0, 2.0, 3.0)) assert(dm1 === dm1) -- cgit v1.2.3