///|
fn finite(value : Double) -> Bool {
  value == value && value != 1.0 / 0.0 && value != -1.0 / 0.0
}

///|
let negative_infinity : Double = -1.0 / 0.0

///|
fn normalize_log_weights(weights : Array[Double]) -> Int {
  let mut maximum = negative_infinity
  let mut maximum_index = 0
  for index in 0.. maximum {
      maximum = weights[index]
      maximum_index = index
    }
  }
  let mut total = 0.0
  for value in weights {
    if value != negative_infinity {
      total = total + @math.exp(value - maximum)
    }
  }
  let evidence = maximum + @math.ln(total)
  for index in 0.. Double {
  let difference = value - mean
  -0.5 *
  (
    @math.ln(2.0 * 3.141592653589793 * variance) +
    difference * difference / variance
  )
}