Dex: Monte Carlo estimates of pi
The following is a port of pi.dx
import "dex-prelude"
First we import the random number implementation from random-numbers.fut and define a few wrapper functions.
module random = import "random-numbers"
type Key = random.lcg.rng
def rand = random.rand_f64
def split = random.lcg.split_n
def newKey = random.lcg.init
The rest of the definition is pretty much just like how Dex does it.
def estimatePiArea (key:Key) : f64 =
let (key, x) = rand key
let (_, y) = rand key
in 4.0 * f64.bool (sq x + sq y < 1)
def estimatePiAvgVal (key:Key) : f64 =
let (_, x) = rand key
in 4.0 * f64.sqrt (1.0 - sq x)
def meanAndStdDev (n: i64) (f: Key -> f64) (key: Key) : (f64, f64) =
let samps = map f (split n key)
in (mean samps, std samps)
For Futhark, we do need some first-order entry points.
def piAreaMeanAndStdDev n seed = meanAndStdDev n estimatePiArea (newKey seed)
def piAvgValMeanAndStdDev n seed = meanAndStdDev n estimatePiAvgVal (newKey seed)
And this is what it looks like:
> piAreaMeanAndStdDev 1000000i64 42i32
(3.140528f64, 1.6429229687407743f64)
> piAvgValMeanAndStdDev 1000000i64 42i32
(3.1403102799937046f64, 0.8936898212149595f64)