diff options
author | Jakob Odersky <jodersky@gmail.com> | 2012-11-01 15:27:12 +0100 |
---|---|---|
committer | Jakob Odersky <jodersky@gmail.com> | 2012-11-01 15:27:12 +0100 |
commit | c4215c2c360a54cec08d3dbc13d1ed5156996b3b (patch) | |
tree | 01d867c9de98b2724ad9ef882b703b004c431783 | |
parent | 588583bee6f9758983dd3e6ebc4b278c85e3ab45 (diff) | |
download | scalam-c4215c2c360a54cec08d3dbc13d1ed5156996b3b.tar.gz scalam-c4215c2c360a54cec08d3dbc13d1ed5156996b3b.tar.bz2 scalam-c4215c2c360a54cec08d3dbc13d1ed5156996b3b.zip |
add generic I/O support
-rw-r--r-- | src/main/scala/scalam/io/Loadable.scala | 7 | ||||
-rw-r--r-- | src/main/scala/scalam/io/Saveable.scala | 7 | ||||
-rw-r--r-- | src/main/scala/scalam/io/package.scala | 18 | ||||
-rw-r--r-- | src/main/scala/scalam/package.scala | 29 | ||||
-rw-r--r-- | src/main/scala/scalam/plotting/DataSet.scala | 17 |
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(), "", "") + } + } |