Skip to content

Commit

Permalink
[SPARK-23085][ML] API parity for mllib.linalg.Vectors.sparse
Browse files Browse the repository at this point in the history
## What changes were proposed in this pull request?
`ML.Vectors#sparse(size: Int, elements: Seq[(Int, Double)])` support zero-length

## How was this patch tested?
existing tests

Author: Zheng RuiFeng <[email protected]>

Closes apache#20275 from zhengruifeng/SparseVector_size.
  • Loading branch information
zhengruifeng authored and srowen committed Jan 19, 2018
1 parent 6c39654 commit 606a748
Show file tree
Hide file tree
Showing 4 changed files with 30 additions and 3 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -565,7 +565,7 @@ class SparseVector @Since("2.0.0") (

// validate the data
{
require(size >= 0, "The size of the requested sparse vector must be greater than 0.")
require(size >= 0, "The size of the requested sparse vector must be no less than 0.")
require(indices.length == values.length, "Sparse vectors require that the dimension of the" +
s" indices match the dimension of the values. You provided ${indices.length} indices and " +
s" ${values.length} values.")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -366,4 +366,18 @@ class VectorsSuite extends SparkMLFunSuite {
assert(v.slice(Array(2, 0)) === new SparseVector(2, Array(0), Array(2.2)))
assert(v.slice(Array(2, 0, 3, 4)) === new SparseVector(4, Array(0, 3), Array(2.2, 4.4)))
}

test("sparse vector only support non-negative length") {
val v1 = Vectors.sparse(0, Array.emptyIntArray, Array.emptyDoubleArray)
val v2 = Vectors.sparse(0, Array.empty[(Int, Double)])
assert(v1.size === 0)
assert(v2.size === 0)

intercept[IllegalArgumentException] {
Vectors.sparse(-1, Array(1), Array(2.0))
}
intercept[IllegalArgumentException] {
Vectors.sparse(-1, Array((1, 2.0)))
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -326,8 +326,6 @@ object Vectors {
*/
@Since("1.0.0")
def sparse(size: Int, elements: Seq[(Int, Double)]): Vector = {
require(size > 0, "The size of the requested sparse vector must be greater than 0.")

val (indices, values) = elements.sortBy(_._1).unzip
var prev = -1
indices.foreach { i =>
Expand Down Expand Up @@ -758,6 +756,7 @@ class SparseVector @Since("1.0.0") (
@Since("1.0.0") val indices: Array[Int],
@Since("1.0.0") val values: Array[Double]) extends Vector {

require(size >= 0, "The size of the requested sparse vector must be no less than 0.")
require(indices.length == values.length, "Sparse vectors require that the dimension of the" +
s" indices match the dimension of the values. You provided ${indices.length} indices and " +
s" ${values.length} values.")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -495,4 +495,18 @@ class VectorsSuite extends SparkFunSuite with Logging {
assert(mlDenseVectorToArray(dv) === mlDenseVectorToArray(newDV))
assert(mlSparseVectorToArray(sv) === mlSparseVectorToArray(newSV))
}

test("sparse vector only support non-negative length") {
val v1 = Vectors.sparse(0, Array.emptyIntArray, Array.emptyDoubleArray)
val v2 = Vectors.sparse(0, Array.empty[(Int, Double)])
assert(v1.size === 0)
assert(v2.size === 0)

intercept[IllegalArgumentException] {
Vectors.sparse(-1, Array(1), Array(2.0))
}
intercept[IllegalArgumentException] {
Vectors.sparse(-1, Array((1, 2.0)))
}
}
}

0 comments on commit 606a748

Please sign in to comment.