///|
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..