84 lines
2.2 KiB
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)
|
|
}
|
|
|
|
}
|