From 96bed3a170d54cfc51cb3efebc4bac02275c5dff Mon Sep 17 00:00:00 2001 From: John Canny Date: Fri, 18 Oct 2019 19:36:57 -0700 Subject: [PATCH] fix 0-dim mean and variance --- pom.xml | 2 +- src/main/scala/BIDMat/DMat.scala | 13 +++++++++++-- src/main/scala/BIDMat/FMat.scala | 14 ++++++++++++-- src/main/scala/BIDMat/GDMat.scala | 14 ++++++++++++-- src/main/scala/BIDMat/GMat.scala | 14 ++++++++++++-- 5 files changed, 48 insertions(+), 9 deletions(-) diff --git a/pom.xml b/pom.xml index d5049686..9f601647 100755 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ BIDMat BIDMat jar - 2.1.9-cuda9.2 + 2.1.10-cuda9.2 BIDMat BIDMat performs matrix operations diff --git a/src/main/scala/BIDMat/DMat.scala b/src/main/scala/BIDMat/DMat.scala index f6e1d087..c4321de7 100755 --- a/src/main/scala/BIDMat/DMat.scala +++ b/src/main/scala/BIDMat/DMat.scala @@ -1411,13 +1411,22 @@ case class DMat(dims0:Array[Int], val data:Array[Double]) extends DenseMat[Doubl override def sum(inds:IMat):DMat = reduce(inds.data, SciFunctions.sum, "sum") override def prod(inds:IMat):DMat = reduce(inds.data, SciFunctions.prod, "prod") - override def mean(inds:IMat):DMat = reduce(inds.data, SciFunctions.mean, "mean") - override def variance(inds:IMat):DMat = reduce(inds.data, SciFunctions.variance, "variance") override def maxi(inds:IMat):DMat = reduce(inds.data, SciFunctions.maxi, "maxi") override def mini(inds:IMat):DMat = reduce(inds.data, SciFunctions.mini, "mini") override def amax(inds:IMat):DMat = reduce(inds.data, SciFunctions.maxi, "amax") override def amin(inds:IMat):DMat = reduce(inds.data, SciFunctions.mini, "amin") + override def mean(inds:IMat):DMat = {val m = this.sum(inds); + m ~ m *@ (1.0/SciFunctions.prod(this.dims(inds)).v); + m} + override def variance(inds:IMat):DMat = {val m = this.sum(inds); + val n = SciFunctions.prod(this.dims(inds)).v; + m ~ m *@ (1.0/n) + val a = this - m; + a ~ a *@ a + val v = a.sum(inds); + v ~ v *@ (1.0/n); + v} override def * (b : Double) = fDMult(DMat.delem(b), null) override def + (b : Double) = ddMatOpScalarv(b, DMat.vecAddFun, null) diff --git a/src/main/scala/BIDMat/FMat.scala b/src/main/scala/BIDMat/FMat.scala index 011ac8cd..59733edb 100755 --- a/src/main/scala/BIDMat/FMat.scala +++ b/src/main/scala/BIDMat/FMat.scala @@ -804,8 +804,18 @@ case class FMat(dims0:Array[Int], val data:Array[Float]) extends DenseMat[Float] override def mini(inds:IMat):FMat = reduce(inds.data, SciFunctions.mini, reduceTensorFloat, FMat.CBLASop.op_min, "mini") override def amax(inds:IMat):FMat = reduce(inds.data, SciFunctions.maxi, reduceTensorFloat, FMat.CBLASop.op_max, "amax") override def amin(inds:IMat):FMat = reduce(inds.data, SciFunctions.mini, reduceTensorFloat, FMat.CBLASop.op_min, "amin") - override def mean(inds:IMat):FMat = reduce(inds.data, SciFunctions.mean, "mean") - override def variance(inds:IMat):FMat = reduce(inds.data, SciFunctions.variance, "variance") + + override def mean(inds:IMat):FMat = {val m = this.sum(inds); + m ~ m *@ (1f/SciFunctions.prod(this.dims(inds)).v); + m} + override def variance(inds:IMat):FMat = {val m = this.sum(inds); + val n = SciFunctions.prod(this.dims(inds)).v; + m ~ m *@ (1f/n) + val a = this - m; + a ~ a *@ a + val v = a.sum(inds); + v ~ v *@ (1f/n); + v} def fDMultHelper(a:FMat, out:FMat, istart:Int, iend:Int) = { var i = istart diff --git a/src/main/scala/BIDMat/GDMat.scala b/src/main/scala/BIDMat/GDMat.scala index 50298c14..b6e6d0b0 100755 --- a/src/main/scala/BIDMat/GDMat.scala +++ b/src/main/scala/BIDMat/GDMat.scala @@ -1187,13 +1187,23 @@ class GDMat(dims0:Array[Int], @transient var pdata:Pointer, val realsize:Long) e override def sum(inds:IMat):DMat = reduce(inds.data, (a:GDMat, dir:Int) => GDFunctions.sum(a,dir,null), "sum"); override def prod(inds:IMat):DMat = reduce(inds.data, (a:GDMat, dir:Int) => GDFunctions.prod(a,dir,null), "prod"); - override def mean(inds:IMat):DMat = reduce(inds.data, (a:GDMat, dir:Int) => SciFunctions.mean(a,dir), "mean") - override def variance(inds:IMat):DMat = reduce(inds.data, (a:GDMat, dir:Int) => SciFunctions.variance(a,dir), "variance") override def maxi(inds:IMat):DMat = reduce(inds.data, (a:GDMat, dir:Int) => GDFunctions.maxi(a,dir,null), "maxi") override def mini(inds:IMat):DMat = reduce(inds.data, (a:GDMat, dir:Int) => GDFunctions.mini(a,dir,null), "mini") override def amax(inds:IMat):DMat = reduce(inds.data, (a:GDMat, dir:Int) => GDFunctions.maxi(a,dir,null), "amax") override def amin(inds:IMat):DMat = reduce(inds.data, (a:GDMat, dir:Int) => GDFunctions.mini(a,dir,null), "amin") + override def mean(inds:IMat):DMat = {val m = this.sum(inds); + m ~ m *@ (1.0/SciFunctions.prod(this.dims(inds)).v); + m} + override def variance(inds:IMat):DMat = {val m = this.sum(inds); + val n = SciFunctions.prod(this.dims(inds)).v; + m ~ m *@ (1.0/n) + val a = this - m; + a ~ a *@ a + val v = a.sum(inds); + v ~ v *@ (1.0/n); + v} + override def * (a : DMat) = GMult(GDMat(a), null) override def * (a : SDMat) = GSMult(GSDMat(a), null) override def *^ (a : DMat) = GMultT(GDMat(a), null) diff --git a/src/main/scala/BIDMat/GMat.scala b/src/main/scala/BIDMat/GMat.scala index 5a66764e..e27e6d23 100755 --- a/src/main/scala/BIDMat/GMat.scala +++ b/src/main/scala/BIDMat/GMat.scala @@ -1727,8 +1727,18 @@ class GMat(dims0:Array[Int], @transient var pdata:Pointer, val realsize:Long) ex override def mini(inds:IMat):FMat = reduce(inds.data, (a:GMat, dir:Int) => GFunctions.mini(a,dir,null), CUMAT.minTensor, "mini") override def amax(inds:IMat):FMat = reduce(inds.data, (a:GMat, dir:Int) => GFunctions.maxi(a,dir,null), CUMAT.maxTensor, "amax") override def amin(inds:IMat):FMat = reduce(inds.data, (a:GMat, dir:Int) => GFunctions.mini(a,dir,null), CUMAT.minTensor,"amin") - override def mean(inds:IMat):FMat = reduce(inds.data, (a:GMat, dir:Int) => SciFunctions.mean(a,dir), "mean") - override def variance(inds:IMat):FMat = reduce(inds.data, (a:GMat, dir:Int) => SciFunctions.variance(a,dir), "variance") + + override def mean(inds:IMat):FMat = {val m = this.sum(inds); + m ~ m *@ (1f/SciFunctions.prod(this.dims(inds)).v); + m} + override def variance(inds:IMat):FMat = {val m = this.sum(inds); + val n = SciFunctions.prod(this.dims(inds)).v; + m ~ m *@ (1f/n) + val a = this - m; + a ~ a *@ a + val v = a.sum(inds); + v ~ v *@ (1f/n); + v} override def * (a : FMat) = GMult(GMat(a), null) override def * (a : SMat) = GSMult(GSMat(a), null)