Repository: spark Updated Branches: refs/heads/master 04521ea06 -> da46b77af
[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 <[email protected]> Closes #8271 from MechCoder/hash_code_matrices. Project: http://git-wip-us.apache.org/repos/asf/spark/repo Commit: http://git-wip-us.apache.org/repos/asf/spark/commit/da46b77a Tree: http://git-wip-us.apache.org/repos/asf/spark/tree/da46b77a Diff: http://git-wip-us.apache.org/repos/asf/spark/diff/da46b77a Branch: refs/heads/master Commit: da46b77afd13df8eb696e4612224ae29cc198c0b Parents: 04521ea Author: MechCoder <[email protected]> Authored: Tue Oct 20 16:35:34 2015 -0700 Committer: Xiangrui Meng <[email protected]> Committed: Tue Oct 20 16:35:34 2015 -0700 ---------------------------------------------------------------------- .../scala/org/apache/spark/mllib/linalg/Matrices.scala | 4 ++++ .../org/apache/spark/mllib/linalg/MatricesSuite.scala | 11 +++++++++++ 2 files changed, 15 insertions(+) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/spark/blob/da46b77a/mllib/src/main/scala/org/apache/spark/mllib/linalg/Matrices.scala ---------------------------------------------------------------------- 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 c02ba42..cfed9ad 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 { http://git-wip-us.apache.org/repos/asf/spark/blob/da46b77a/mllib/src/test/scala/org/apache/spark/mllib/linalg/MatricesSuite.scala ---------------------------------------------------------------------- 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 bfd6d54..b0071c9 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) --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
