aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJakob Odersky <jodersky@gmail.com>2012-10-28 11:10:39 +0100
committerJakob Odersky <jodersky@gmail.com>2012-10-28 11:10:39 +0100
commit9892e907e8db3204a890fc530ddc9e34cdaf096b (patch)
tree64e6c6d93357eef75f04466a103617fd49f53908 /src
parenta9c3a3b9e00b28380254ff9f274cb05754604464 (diff)
downloadscalam-9892e907e8db3204a890fc530ddc9e34cdaf096b.tar.gz
scalam-9892e907e8db3204a890fc530ddc9e34cdaf096b.tar.bz2
scalam-9892e907e8db3204a890fc530ddc9e34cdaf096b.zip
improve integration of DenseVector into collection framework:
* factor out similarities between *Wrapped and *Ops to *Like * remove custom builder (use array buffer instead sonce DenseVectors are backed by arrays) * refactor CanBuildFroms * make LowPriority implicits to a trait
Diffstat (limited to 'src')
-rw-r--r--src/main/scala/scalam/LowPriorityImplicits.scala2
-rw-r--r--src/main/scala/scalam/collection/DenseVectorBuilder.scala16
-rw-r--r--src/main/scala/scalam/collection/DenseVectorLike.scala12
-rw-r--r--src/main/scala/scalam/collection/DenseVectorOps.scala32
-rw-r--r--src/main/scala/scalam/collection/WrappedDenseVector.scala19
-rw-r--r--src/main/scala/scalam/package.scala10
6 files changed, 53 insertions, 38 deletions
diff --git a/src/main/scala/scalam/LowPriorityImplicits.scala b/src/main/scala/scalam/LowPriorityImplicits.scala
index ca0f378..4eec21a 100644
--- a/src/main/scala/scalam/LowPriorityImplicits.scala
+++ b/src/main/scala/scalam/LowPriorityImplicits.scala
@@ -3,7 +3,7 @@ package scalam
import breeze.linalg.DenseVector
import scalam.collection._
-object LowPriorityImplicits {
+trait LowPriorityImplicits {
implicit def wrapDenseVector[A: ClassManifest](v: DenseVector[A]) = new WrappedDenseVector(v)
implicit def unwrapDenseVector[A: ClassManifest](w: WrappedDenseVector[A]) = w.self
diff --git a/src/main/scala/scalam/collection/DenseVectorBuilder.scala b/src/main/scala/scalam/collection/DenseVectorBuilder.scala
deleted file mode 100644
index 84501bd..0000000
--- a/src/main/scala/scalam/collection/DenseVectorBuilder.scala
+++ /dev/null
@@ -1,16 +0,0 @@
-package scalam.collection
-
-import scala.collection.mutable.Builder
-import scala.collection.mutable.ArrayBuffer
-import breeze.linalg.DenseVector
-
-class DenseVectorBuilder[Elem: ClassManifest] extends Builder[Elem, DenseVector[Elem]] {
- private val buffer = new ArrayBuffer[Elem]
-
- override def +=(elem: Elem) = {buffer += elem; this}
- override def clear() = buffer.clear
- override def result() = {
- val a = buffer.mapResult(_.toArray).result
- DenseVector(a)
- }
-} \ No newline at end of file
diff --git a/src/main/scala/scalam/collection/DenseVectorLike.scala b/src/main/scala/scalam/collection/DenseVectorLike.scala
new file mode 100644
index 0000000..e34f05c
--- /dev/null
+++ b/src/main/scala/scalam/collection/DenseVectorLike.scala
@@ -0,0 +1,12 @@
+package scalam.collection
+
+import scala.collection.mutable.IndexedSeqLike
+import breeze.linalg.DenseVector
+
+trait DenseVectorLike[Elem, Repr] extends IndexedSeqLike[Elem, Repr]{
+ def self: DenseVector[Elem]
+
+ override def apply(index: Int): Elem = self.apply(index)
+ override def update(index: Int, value: Elem): Unit = self.update(index, value)
+ override def length: Int = self.length
+} \ No newline at end of file
diff --git a/src/main/scala/scalam/collection/DenseVectorOps.scala b/src/main/scala/scalam/collection/DenseVectorOps.scala
index b7b6446..7f8e9f9 100644
--- a/src/main/scala/scalam/collection/DenseVectorOps.scala
+++ b/src/main/scala/scalam/collection/DenseVectorOps.scala
@@ -1,16 +1,32 @@
package scalam.collection
-import scala.collection.mutable.IndexedSeqOptimized
import breeze.linalg.DenseVector
+import scala.collection.mutable.ArrayBuffer
+import scala.collection.generic.CanBuildFrom
+import scala.collection.mutable.Builder
/* TODO find solution to remove class manifest */
-class DenseVectorOps[Elem: ClassManifest](self: DenseVector[Elem]) extends IndexedSeqOptimized/*Like*/[Elem, DenseVector[Elem]] {
- override def newBuilder = new DenseVectorBuilder[Elem]
+class DenseVectorOps[Elem: ClassManifest](override val repr: DenseVector[Elem]) extends DenseVectorLike[Elem, DenseVector[Elem]] {
+ val self = repr
+ def newBuilder = DenseVectorOps.newBuilder[Elem]
- override def apply(index: Int) = self.apply(index)
- override def update(index: Int, value: Elem) = self.update(index, value)
- override def length = self.length
-
- override def seq = this
+ override protected[this] def thisCollection = new WrappedDenseVector(self)
+ override protected[this] def toCollection(repr: DenseVector[Elem]): WrappedDenseVector[Elem] = new WrappedDenseVector(repr)
+ override def seq = thisCollection
}
+object DenseVectorOps {
+ def newBuilder[Elem: ClassManifest] = new ArrayBuffer[Elem] mapResult (x => new DenseVector(x.toArray))
+
+ implicit def canBuildFrom[T: ClassManifest] = new CanBuildFrom[DenseVector[_], T, DenseVector[T]] {
+ def apply(from: DenseVector[_]): Builder[T, DenseVector[T]] = newBuilder[T]
+ def apply: Builder[T, DenseVector[T]] = newBuilder[T]
+ }
+ /*
+ implicit def denseVectorBuildFrom[A: ClassManifest]: CanBuildFrom[DenseVector[_], A, DenseVector[A]] =
+ new CanBuildFrom[DenseVector[_], A, DenseVector[A]] {
+ def apply(from: DenseVector[_]): Builder[A, DenseVector[A]] = apply()
+ def apply(): Builder[A, DenseVector[A]] = collection.DenseVectorOps.newBuilder[A]
+ }
+ */
+}
diff --git a/src/main/scala/scalam/collection/WrappedDenseVector.scala b/src/main/scala/scalam/collection/WrappedDenseVector.scala
index 43638c6..36926d9 100644
--- a/src/main/scala/scalam/collection/WrappedDenseVector.scala
+++ b/src/main/scala/scalam/collection/WrappedDenseVector.scala
@@ -1,25 +1,20 @@
package scalam.collection
-import scala.collection.mutable.IndexedSeqOptimized
+import scala.collection.mutable.IndexedSeq
import breeze.linalg.DenseVector
import scala.collection.mutable.Builder
import scala.collection.generic.CanBuildFrom
-import scala.collection.generic.SeqFactory
-import scala.collection.generic.GenericCompanion
-import scala.collection.mutable.IndexedSeqLike
+import scala.collection.mutable.ArrayBuffer
-class WrappedDenseVector[Elem: ClassManifest](val self: DenseVector[Elem]) extends IndexedSeq[Elem] with IndexedSeqLike[Elem, WrappedDenseVector[Elem]] {
- override def update(index: Int, value: Elem) = self.update(index, value)
- override def apply(index: Int) = self.apply(index)
- override def length = self.length
- override protected[this] def newBuilder: Builder[Elem, WrappedDenseVector[Elem]] = (new DenseVectorBuilder[Elem]) mapResult (new WrappedDenseVector(_))
+class WrappedDenseVector[Elem: ClassManifest](val self: DenseVector[Elem]) extends IndexedSeq[Elem] with DenseVectorLike[Elem, WrappedDenseVector[Elem]] {
+ override protected[this] def newBuilder: Builder[Elem, WrappedDenseVector[Elem]] = WrappedDenseVector.newBuilder[Elem]
}
object WrappedDenseVector {
- def newBuilder[Elem: ClassManifest] = (new DenseVectorBuilder[Elem]) mapResult (new WrappedDenseVector(_))
+ def newBuilder[Elem: ClassManifest] = (new ArrayBuffer[Elem]) mapResult (x => new WrappedDenseVector(DenseVector(x.toArray)))
implicit def canBuildFrom[T: ClassManifest] = new CanBuildFrom[WrappedDenseVector[_], T, WrappedDenseVector[T]] {
- def apply(from: WrappedDenseVector[_]): Builder[T, WrappedDenseVector[T]] = newBuilder
- def apply: Builder[T, WrappedDenseVector[T]] = newBuilder
+ def apply(from: WrappedDenseVector[_]): Builder[T, WrappedDenseVector[T]] = newBuilder[T]
+ def apply: Builder[T, WrappedDenseVector[T]] = newBuilder[T]
}
} \ No newline at end of file
diff --git a/src/main/scala/scalam/package.scala b/src/main/scala/scalam/package.scala
index 76957fe..da0888c 100644
--- a/src/main/scala/scalam/package.scala
+++ b/src/main/scala/scalam/package.scala
@@ -1,8 +1,16 @@
import breeze.linalg.DenseVector
import scalam.collection._
+import scala.collection.generic.CanBuildFrom
+import scala.collection.mutable.Builder
-package object scalam extends LowPriorityImplicits{
+package object scalam extends LowPriorityImplicits {
implicit def denseVector2Ops[A: ClassManifest](v: DenseVector[A]) = new DenseVectorOps(v)
+ implicit def denseVectorBuildFrom[A: ClassManifest]: CanBuildFrom[DenseVector[_], A, DenseVector[A]] =
+ new CanBuildFrom[DenseVector[_], A, DenseVector[A]] {
+ def apply(from: DenseVector[_]): Builder[A, DenseVector[A]] = apply()
+ def apply(): Builder[A, DenseVector[A]] = collection.DenseVectorOps.newBuilder[A]
+ }
+
} \ No newline at end of file