mimir-pip/lib/src/org/mimirdb/pip/distribution/numerical/Uniform.scala

84 lines
2.2 KiB
Scala

package org.mimirdb.pip.distribution.numerical
import scala.util.Random
import java.io.Serializable
import java.io.ObjectOutputStream
import java.io.ObjectInputStream
import org.apache.commons.math3.special.Erf
import org.apache.spark.sql.Column
import org.apache.spark.sql.types.DoubleType
import org.mimirdb.pip.SampleParams
import org.mimirdb.pip.udt.UnivariateDistribution
import org.mimirdb.pip.udt.UnivariateDistributionType
import org.mimirdb.pip.udt.UnivariateDistributionConstructor
import org.apache.spark.sql.catalyst.expressions.Expression
/**
* The Uniform distribution
*
*/
object Uniform
extends NumericalDistributionFamily
with CDFSupported
with ICDFSupported
{
case class Params(min: Double, max: Double)
{
assert(min <= max)
def width = max - min
}
def sample(params: Any, random: scala.util.Random): Double =
{
random.nextDouble() * params.asInstanceOf[Params].width
+ params.asInstanceOf[Params].min
}
def serialize(in: ObjectOutputStream, params: Any): Unit =
{
in.writeDouble(params.asInstanceOf[Params].min)
in.writeDouble(params.asInstanceOf[Params].max)
}
def deserialize(in: ObjectInputStream): Params =
{
return Params(
min = in.readDouble(),
max = in.readDouble()
)
}
def min(params: Any) = params.asInstanceOf[Params].min
def max(params: Any) = params.asInstanceOf[Params].max
def cdf(value: Double, params: Any): Double =
{
val p = params.asInstanceOf[Params]
if(value < p.min) { 0.0 }
else if(value >= p.max) { 1.0 }
else { (value - p.min) / p.width }
}
def icdf(value: Double, params: Any): Double =
{
val p = params.asInstanceOf[Params]
value * p.width + p.min
}
def describe(params: Any): String =
s"Uniform(min: ${params.asInstanceOf[Params].min}, max: ${params.asInstanceOf[Params].max})"
case class Constructor(args: Seq[Expression])
extends UnivariateDistributionConstructor
{
def family = Uniform
def params(values: Seq[Any]) =
Params(min = values(0).asInstanceOf[Double],
max = values(1).asInstanceOf[Double])
def withNewChildrenInternal(newChildren: IndexedSeq[Expression]) =
copy(args = newChildren)
}
}