From a9c3a3b9e00b28380254ff9f274cb05754604464 Mon Sep 17 00:00:00 2001 From: Jakob Odersky Date: Thu, 18 Oct 2012 22:05:02 +0200 Subject: first implementation of integration of breeze DenseVectors to scala collections --- src/main/scala/scalam/LowPriorityImplicits.scala | 11 ++++++++++ .../scalam/collection/DenseVectorBuilder.scala | 16 ++++++++++++++ .../scala/scalam/collection/DenseVectorOps.scala | 16 ++++++++++++++ .../scalam/collection/WrappedDenseVector.scala | 25 ++++++++++++++++++++++ src/main/scala/scalam/package.scala | 8 +++++++ 5 files changed, 76 insertions(+) create mode 100644 src/main/scala/scalam/LowPriorityImplicits.scala create mode 100644 src/main/scala/scalam/collection/DenseVectorBuilder.scala create mode 100644 src/main/scala/scalam/collection/DenseVectorOps.scala create mode 100644 src/main/scala/scalam/collection/WrappedDenseVector.scala create mode 100644 src/main/scala/scalam/package.scala diff --git a/src/main/scala/scalam/LowPriorityImplicits.scala b/src/main/scala/scalam/LowPriorityImplicits.scala new file mode 100644 index 0000000..ca0f378 --- /dev/null +++ b/src/main/scala/scalam/LowPriorityImplicits.scala @@ -0,0 +1,11 @@ +package scalam + +import breeze.linalg.DenseVector +import scalam.collection._ + +object LowPriorityImplicits { + + implicit def wrapDenseVector[A: ClassManifest](v: DenseVector[A]) = new WrappedDenseVector(v) + implicit def unwrapDenseVector[A: ClassManifest](w: WrappedDenseVector[A]) = w.self + +} \ No newline at end of file diff --git a/src/main/scala/scalam/collection/DenseVectorBuilder.scala b/src/main/scala/scalam/collection/DenseVectorBuilder.scala new file mode 100644 index 0000000..84501bd --- /dev/null +++ b/src/main/scala/scalam/collection/DenseVectorBuilder.scala @@ -0,0 +1,16 @@ +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/DenseVectorOps.scala b/src/main/scala/scalam/collection/DenseVectorOps.scala new file mode 100644 index 0000000..b7b6446 --- /dev/null +++ b/src/main/scala/scalam/collection/DenseVectorOps.scala @@ -0,0 +1,16 @@ +package scalam.collection + +import scala.collection.mutable.IndexedSeqOptimized +import breeze.linalg.DenseVector + +/* 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] + + 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 +} + diff --git a/src/main/scala/scalam/collection/WrappedDenseVector.scala b/src/main/scala/scalam/collection/WrappedDenseVector.scala new file mode 100644 index 0000000..43638c6 --- /dev/null +++ b/src/main/scala/scalam/collection/WrappedDenseVector.scala @@ -0,0 +1,25 @@ +package scalam.collection + +import scala.collection.mutable.IndexedSeqOptimized +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 + +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(_)) +} + +object WrappedDenseVector { + def newBuilder[Elem: ClassManifest] = (new DenseVectorBuilder[Elem]) mapResult (new WrappedDenseVector(_)) + + 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 + } +} \ No newline at end of file diff --git a/src/main/scala/scalam/package.scala b/src/main/scala/scalam/package.scala new file mode 100644 index 0000000..76957fe --- /dev/null +++ b/src/main/scala/scalam/package.scala @@ -0,0 +1,8 @@ +import breeze.linalg.DenseVector +import scalam.collection._ + +package object scalam extends LowPriorityImplicits{ + + implicit def denseVector2Ops[A: ClassManifest](v: DenseVector[A]) = new DenseVectorOps(v) + +} \ No newline at end of file -- cgit v1.2.3