aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakob Odersky <jodersky@gmail.com>2012-11-01 15:27:12 +0100
committerJakob Odersky <jodersky@gmail.com>2012-11-01 15:27:12 +0100
commitc4215c2c360a54cec08d3dbc13d1ed5156996b3b (patch)
tree01d867c9de98b2724ad9ef882b703b004c431783
parent588583bee6f9758983dd3e6ebc4b278c85e3ab45 (diff)
downloadscalam-c4215c2c360a54cec08d3dbc13d1ed5156996b3b.tar.gz
scalam-c4215c2c360a54cec08d3dbc13d1ed5156996b3b.tar.bz2
scalam-c4215c2c360a54cec08d3dbc13d1ed5156996b3b.zip
add generic I/O support
-rw-r--r--src/main/scala/scalam/io/Loadable.scala7
-rw-r--r--src/main/scala/scalam/io/Saveable.scala7
-rw-r--r--src/main/scala/scalam/io/package.scala18
-rw-r--r--src/main/scala/scalam/package.scala29
-rw-r--r--src/main/scala/scalam/plotting/DataSet.scala17
5 files changed, 63 insertions, 15 deletions
diff --git a/src/main/scala/scalam/io/Loadable.scala b/src/main/scala/scalam/io/Loadable.scala
new file mode 100644
index 0000000..703c1fa
--- /dev/null
+++ b/src/main/scala/scalam/io/Loadable.scala
@@ -0,0 +1,7 @@
+package scalam.io
+
+import scalax.io.Input
+
+trait Loadable[A] {
+ def load(in: Input): A
+} \ No newline at end of file
diff --git a/src/main/scala/scalam/io/Saveable.scala b/src/main/scala/scalam/io/Saveable.scala
new file mode 100644
index 0000000..bf33d94
--- /dev/null
+++ b/src/main/scala/scalam/io/Saveable.scala
@@ -0,0 +1,7 @@
+package scalam.io
+
+import scalax.io.Output
+
+trait Saveable {
+ def save(out: Output)
+} \ No newline at end of file
diff --git a/src/main/scala/scalam/io/package.scala b/src/main/scala/scalam/io/package.scala
index a5217de..4f1ef09 100644
--- a/src/main/scala/scalam/io/package.scala
+++ b/src/main/scala/scalam/io/package.scala
@@ -4,20 +4,16 @@ import scalax.file.Path
import breeze.linalg._
package object io {
-
- def load(path: Path, separator: String = "\\s"): DenseMatrix[Double] = {
- val lines = path.lines().dropWhile(_.isEmpty).toArray
- val elements: Array[Array[String]] = lines map (_.split(separator))
- require(elements.forall(_.length == elements(0).length), "Cannot load non-rectangular matrix. Check your data file.")
-
- val rows: Array[Array[Double]] = elements.map(_.map(_.toDouble))
- DenseMatrix(rows: _*)
+
+ def load[A: Loadable](path: Path): A = {
+ val loadable = implicitly[Loadable[A]]
+ loadable.load(path)
}
-
- def save(path: Path, m: DenseMatrix[Double]): Unit = {
+
+ def save[A <% Saveable](objectToSave: A, path: Path) = {
path.createFile(createParents = true, failIfExists = false)
for (processor <- path.outputProcessor; out = processor.asOutput)
- for (i <- 0 until m.rows) m(i, ::).valuesIterator.mkString(""," ","\n")
+ objectToSave.save(out)
}
} \ No newline at end of file
diff --git a/src/main/scala/scalam/package.scala b/src/main/scala/scalam/package.scala
index 6a167eb..b8de338 100644
--- a/src/main/scala/scalam/package.scala
+++ b/src/main/scala/scalam/package.scala
@@ -1,7 +1,9 @@
import breeze.linalg.DenseVector
+import breeze.linalg.DenseMatrix
import scalam.collection._
import scala.collection.generic.CanBuildFrom
import scala.collection.mutable.Builder
+import scalam.io.{ Loadable, Saveable }
/**
* A number of commonly applied implicit conversions are defined here, and
@@ -26,4 +28,31 @@ package object scalam extends LowPriorityImplicits {
def apply(): Builder[A, DenseVector[A]] = collection.DenseVectorOps.newBuilder[A]
}
+ def denseMatrixIsLoadable[A: ClassManifest](converter: String => A): Loadable[DenseMatrix[A]] = new Loadable[DenseMatrix[A]] {
+ def load(in: scalax.io.Input) = {
+ val lines: Array[String] = in.lines().dropWhile(_.isEmpty).toArray
+ val separator = "\\s|,"
+ val elements: Array[Array[String]] = lines.map(_.split(separator))
+ require(elements.forall(_.length == elements(0).length), "Cannot load non-rectangular matrix. Check your data file.")
+
+ val linear = elements.transpose.flatten
+ new DenseMatrix(elements.length, linear.map(converter(_)))
+ }
+ }
+
+ implicit def intDenseIsLoadable = denseMatrixIsLoadable[Int](_.toInt)
+ implicit def doubleDenseIsLoadable = denseMatrixIsLoadable[Double](_.toDouble)
+ implicit def floatDenseIsLoadable = denseMatrixIsLoadable[Float](_.toFloat)
+ implicit def byteDenseIsLoadable = denseMatrixIsLoadable[Byte](_.toByte)
+ implicit def longDenseIsLoadable = denseMatrixIsLoadable[Long](_.toLong)
+ implicit def booleanDenseIsLoadable = denseMatrixIsLoadable[Boolean](_.toBoolean)
+
+ /* implicit val string2Int: (String => Int) = (x: String) => x.toInt
+ implicit val string2Double: (String => Double) = (x: String) => x.toDouble
+ implicit val string2Char: (String => Char) = (x: String) => x.toChar*/
+
+ //implicit val cv = (d: String) => d.toDouble
+
+ //val m = scalam.io.load[DenseMatrix[Double]](scalax.file.Path(""))
+
} \ No newline at end of file
diff --git a/src/main/scala/scalam/plotting/DataSet.scala b/src/main/scala/scalam/plotting/DataSet.scala
index 31e65c7..052ad8c 100644
--- a/src/main/scala/scalam/plotting/DataSet.scala
+++ b/src/main/scala/scalam/plotting/DataSet.scala
@@ -3,11 +3,12 @@ package scalam.plotting
import scalam.m.ast.Identifier
import scalax.file.Path
import breeze.linalg.{ Vector, DenseVector }
+import scalam.io._
case class DataSet(points: Seq[(Double, Double)], label: String, name: String) {
-
+
lazy val (xs, ys) = points.unzip
-
+
def save(path: Path) = {
path.createFile(createParents = true, failIfExists = false)
for (processor <- path.outputProcessor; out = processor.asOutput)
@@ -17,8 +18,16 @@ case class DataSet(points: Seq[(Double, Double)], label: String, name: String) {
}
object DataSet {
-
+
def apply(points: Seq[(Double, Double)], label: String) = new DataSet(points, label, Identifier.makeValid(label))
-
+
+ implicit val dataSetIsSaveable = (ds: DataSet) => new Saveable {
+ def save(out: scalax.io.Output) = for ((x, y) <- ds.points) yield out.write(x + " " + y + "\n")
+ }
+
+ implicit def dataSetIsLoadable = new Loadable[DataSet] {
+ def load(in: scalax.io.Input) = new DataSet(Seq(), "", "")
+ }
+
}