Skip to content

Commit bbf07cf

Browse files
committed
Decomposable Kernels feature now working
To Do: 1. Re-implement addition and multiplication of kernels in terms of DecomposableKernel class
1 parent 3378a31 commit bbf07cf

File tree

5 files changed

+60
-9
lines changed

5 files changed

+60
-9
lines changed

build.sbt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ packageDescription := "DynaML is a scala library/repl for implementing and worki
1212
"which can be extended easily to implement advanced models for small and large scale applications.\n\n"+
1313
"But the library can also be used as an educational/research tool for data analysis."
1414

15-
val mainVersion = "v1.4.1-beta.6"
15+
val mainVersion = "v1.4.1-beta.7"
1616

1717
val dataDirectory = settingKey[File]("The directory holding the data files for running example scripts")
1818

conf/DynaMLInit.scala

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,8 @@ import io.github.mandar2812.dynaml.examples._
3535
import io.github.mandar2812.dynaml.models.neuralnets.TransferFunctions._
3636
//The probability API
3737
import io.github.mandar2812.dynaml.probability._
38+
//Wavelet API
39+
import io.github.mandar2812.dynaml.wavelets._
3840
//OpenML support
3941
import io.github.mandar2812.dynaml.openml.OpenML
4042
//Renjin imports

dynaml-core/src/main/scala-2.11/io/github/mandar2812/dynaml/DynaMLPipe.scala

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,13 +24,15 @@ import io.github.mandar2812.dynaml.evaluation.RegressionMetrics
2424
import io.github.mandar2812.dynaml.models.ParameterizedLearner
2525
import io.github.mandar2812.dynaml.models.gp.AbstractGPRegressionModel
2626
import io.github.mandar2812.dynaml.optimization.{CoupledSimulatedAnnealing, GPMLOptimizer, GloballyOptWithGrad, GridSearch}
27-
import io.github.mandar2812.dynaml.pipes.{DataPipe, ReversibleScaler, Scaler, StreamDataPipe}
27+
import io.github.mandar2812.dynaml.pipes._
2828
import io.github.mandar2812.dynaml.utils.{GaussianScaler, MVGaussianScaler, MinMaxScaler}
2929
import io.github.mandar2812.dynaml.wavelets.{GroupedHaarWaveletFilter, HaarWaveletFilter, InvGroupedHaarWaveletFilter, InverseHaarWaveletFilter}
3030
import org.apache.log4j.Logger
3131
import org.renjin.script.RenjinScriptEngine
3232
import org.renjin.sexp._
3333

34+
import scala.reflect.ClassTag
35+
3436
/**
3537
* @author mandar2812 datum 3/2/16.
3638
*
@@ -557,6 +559,34 @@ object DynaMLPipe {
557559

558560
val invGroupedHaarWaveletFilter = (orders: Array[Int]) => InvGroupedHaarWaveletFilter(orders)
559561

562+
563+
def genericReplicationEncoder[I](n: Int)(implicit tag: ClassTag[I]): Encoder[I, Array[I]] = Encoder[I, Array[I]]((v: I) => {
564+
Array.fill[I](n)(v)
565+
}, (vs: Array[I]) => {
566+
vs.head
567+
})
568+
569+
/**
570+
* Creates an [[Encoder]] which can split
571+
* [[DenseVector]] instances into uniform splits and
572+
* put them back together.
573+
* */
574+
val breezeDVSplitEncoder = (n: Int) => Encoder((v: DenseVector[Double]) => {
575+
v.toArray.grouped(n).map(DenseVector(_)).toArray
576+
}, (vs: Array[DenseVector[Double]]) => {
577+
DenseVector(vs.map(_.toArray).reduceLeft((a,b) => a++b))
578+
})
579+
580+
/**
581+
* Creates an [[Encoder]] which replicates a
582+
* [[DenseVector]] instance n times.
583+
* */
584+
val breezeDVReplicationEncoder = (n: Int) => Encoder((v: DenseVector[Double]) => {
585+
Array.fill(n)(v)
586+
}, (vs: Array[DenseVector[Double]]) => {
587+
vs.head
588+
})
589+
560590
def trainParametricModel[
561591
G, T, Q, R, S, M <: ParameterizedLearner[G, T, Q, R, S]
562592
](regParameter: Double, step: Double = 0.05,

dynaml-core/src/main/scala-2.11/io/github/mandar2812/dynaml/kernels/LocalScalarKernel.scala

Lines changed: 24 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package io.github.mandar2812.dynaml.kernels
22

33
import breeze.linalg.DenseMatrix
4+
import io.github.mandar2812.dynaml.DynaMLPipe
45
import io.github.mandar2812.dynaml.algebra.{PartitionedPSDMatrix, PartitionedVector}
56
import io.github.mandar2812.dynaml.pipes.{DataPipe, Encoder}
67

@@ -82,25 +83,35 @@ abstract class CompositeCovariance[T]
8283
*/
8384
class DecomposableCovariance[S](kernels: LocalScalarKernel[S]*)(
8485
implicit encoding: Encoder[S, Array[S]],
85-
reducer: DataPipe[Array[Double], Double]) extends CompositeCovariance[S] {
86+
reducer: DataPipe[Array[Double], Double] = DecomposableCovariance.:+:) extends CompositeCovariance[S] {
8687

87-
val kernelMap = kernels.map(k => (k.toString.split(".").last, k)).toMap
88+
val kernelMap = kernels.map(k => (k.toString.split("\\.").last, k)).toMap
89+
90+
state = kernels.map(k => {
91+
val id = k.toString.split("\\.").last
92+
k.state.map(h => (id+"/"+h._1, h._2))
93+
}).reduceLeft(_++_)
8894

8995
override val hyper_parameters: List[String] = kernels.map(k => {
90-
val id = k.toString.split(".").last
96+
val id = k.toString.split("\\.").last
9197
k.hyper_parameters.map(h => id+"/"+h)
9298
}).reduceLeft(_++_)
9399

94100
blocked_hyper_parameters = kernels.map(k => {
95-
val id = k.toString.split(".").last
101+
val id = k.toString.split("\\.").last
96102
k.blocked_hyper_parameters.map(h => id+"/"+h)
97103
}).reduceLeft(_++_)
98104

105+
override def repr: DecomposableCovariance[S] = this
106+
99107
override def setHyperParameters(h: Map[String, Double]): DecomposableCovariance.this.type = {
108+
//Sanity Check
109+
assert(effective_hyper_parameters.forall(h.contains),
110+
"All hyper parameters must be contained in the arguments")
100111
//group the hyper params by kernel id
101112
h.toSeq.map(kv => {
102113
val idS = kv._1.split("/")
103-
(idS.head, (idS.last, kv._2))
114+
(idS.head, (idS.last.mkString("/"), kv._2))
104115
}).groupBy(_._1).map(hypC => {
105116
val kid = hypC._1
106117
val hyper_params = hypC._2.map(_._2).toMap
@@ -116,4 +127,12 @@ class DecomposableCovariance[S](kernels: LocalScalarKernel[S]*)(
116127
coupleAndKern._2.evaluate(u,v)
117128
}))
118129
}
130+
}
131+
132+
object DecomposableCovariance {
133+
134+
val :+: = DataPipe((l: Array[Double]) => l.sum)
135+
136+
val :*: = DataPipe((l: Array[Double]) => l.sum)
137+
119138
}

dynaml-pipes/src/main/scala-2.11/io/github/mandar2812/dynaml/pipes/Scaler.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,13 +40,13 @@ object Scaler {
4040
*
4141
*
4242
* */
43-
trait ReversibleScaler[S] extends Scaler[S] {
43+
trait ReversibleScaler[S] extends Scaler[S] with Encoder[S, S]{
4444

4545
/**
4646
* The inverse operation of this scaling.
4747
*
4848
* */
49-
val i: Scaler[S]
49+
override val i: Scaler[S]
5050

5151
def *[T](that: ReversibleScaler[T]) = {
5252

0 commit comments

Comments
 (0)