aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakob Odersky <jodersky@gmail.com>2012-10-18 22:05:02 +0200
committerJakob Odersky <jodersky@gmail.com>2012-10-18 22:05:02 +0200
commita9c3a3b9e00b28380254ff9f274cb05754604464 (patch)
tree48a93d843b765215718bc3df7c867ec9d429ec76
parentccd005b60d87e800718fed605ef4ce2b226b942c (diff)
downloadscalam-a9c3a3b9e00b28380254ff9f274cb05754604464.tar.gz
scalam-a9c3a3b9e00b28380254ff9f274cb05754604464.tar.bz2
scalam-a9c3a3b9e00b28380254ff9f274cb05754604464.zip
first implementation of integration of breeze DenseVectors to scala collections
-rw-r--r--src/main/scala/scalam/LowPriorityImplicits.scala11
-rw-r--r--src/main/scala/scalam/collection/DenseVectorBuilder.scala16
-rw-r--r--src/main/scala/scalam/collection/DenseVectorOps.scala16
-rw-r--r--src/main/scala/scalam/collection/WrappedDenseVector.scala25
-rw-r--r--src/main/scala/scalam/package.scala8
5 files changed, 76 insertions, 0 deletions
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