///|
pub fn central_composite(
  factors : Array[Factor],
  alpha : Double,
  centers~ : Int32 = 1,
) -> Plan raise DesignError {
  validate_factors(factors)
  require_number(alpha)
  if alpha <= 0.0 {
    raise Invalid("axial distance must be positive")
  }
  if factors.length() > 11 {
    raise Budget("CCD factorial core exceeds run budget")
  }
  let core = two_level(factors)
  let points = [ for r in core.runs => r.point.copy() ]
  if centers < 0 || centers > 4096 - points.length() - 2 * factors.length() {
    raise Budget("CCD run budget exceeded")
  }
  for j in 0.. Plan raise DesignError {
  validate_factors(factors)
  let k = factors.length()
  if k < 3 {
    raise Invalid("Box-Behnken requires at least three factors")
  }
  if centers < 0 || centers > 4096 - 2 * k * (k - 1) {
    raise Budget("BBD run budget exceeded")
  }
  let points = []
  for i in 0..