///|
pub fn factorial(
  factors : Array[Factor],
  levels : Array[Int32],
  centers~ : Int32 = 0,
) -> Plan raise DesignError {
  validate_factors(factors)
  if levels.length() != factors.length() {
    raise Invalid("level count dimension mismatch")
  }
  if centers < 0 || centers > 4096 {
    raise Budget("invalid center count")
  }
  let mut count = 1
  for n in levels {
    if n < 2 || n > 64 || count > (4096 - centers) / n {
      raise Budget("factorial run budget exceeded")
    }
    count *= n
  }
  let points : Array[Array[Double]] = []
  for row in 0..= 0; j = j - 1 {
      point[j] = -1.0 +
        2.0 * (value % levels[j]).to_double() / (levels[j] - 1).to_double()
      value /= levels[j]
    }
    points.push(point)
  }
  for _ in 0.. Plan raise DesignError {
  factorial(factors, Array::make(factors.length(), 2), centers~)
}