From 9892e907e8db3204a890fc530ddc9e34cdaf096b Mon Sep 17 00:00:00 2001 From: Jakob Odersky Date: Sun, 28 Oct 2012 11:10:39 +0100 Subject: 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 --- src/main/scala/scalam/LowPriorityImplicits.scala | 2 +- .../scalam/collection/DenseVectorBuilder.scala | 16 ----------- .../scala/scalam/collection/DenseVectorLike.scala | 12 ++++++++ .../scala/scalam/collection/DenseVectorOps.scala | 32 ++++++++++++++++------ .../scalam/collection/WrappedDenseVector.scala | 19 +++++-------- src/main/scala/scalam/package.scala | 10 ++++++- 6 files changed, 53 insertions(+), 38 deletions(-) delete mode 100644 src/main/scala/scalam/collection/DenseVectorBuilder.scala create mode 100644 src/main/scala/scalam/collection/DenseVectorLike.scala (limited to 'src') 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 -- cgit v1.2.3