///|
pub fn foldover(
p : Plan,
mask : Int32,
include_original~ : Bool = true,
) -> Plan raise DesignError {
validate_plan(p)
if mask <= 0 || mask >= 1 << p.factors.length() {
raise Invalid("foldover mask must select known factors")
}
if include_original && p.runs.length() > 2048 {
raise Budget("foldover exceeds 4096 runs")
}
let runs : Array[Run] = if include_original { p.runs.copy() } else { [] }
for r in p.runs {
let point = r.point.copy()
for j in 0.. Plan raise DesignError {
validate_plan(p)
if copies < 1 || copies > 4096 / p.runs.length() {
raise Budget("replication exceeds run budget")
}
let runs : Array[Run] = []
for k in 0.. Plan raise DesignError {
validate_plan(p)
if count < 0 || count > 4096 - p.runs.length() {
raise Budget("center augmentation exceeds run budget")
}
let runs = p.runs.copy()
for k in 0..