///|
/// Explicit exclusions are (origin, development-age) pairs. Recent=0 uses all.
pub fn selected_factors(
triangle : Triangle,
average~ : Average = Volume,
recent~ : Int32 = 0,
excluded~ : Array[(Int32, Int32)] = [],
overrides~ : Array[(Int32, Double)] = [],
) -> Array[FactorStat] raise RunoffError {
let n = triangle.order()
if recent < 0 || recent > n {
raise Selection("recent window outside 0..order")
}
for k in 0..= n - 1 || origin < 0 || origin >= n - age - 1 {
raise Selection("excluded pair is not observed")
}
for j in 0..= n - 1 {
raise Selection("override age outside pattern")
}
nonnegative(factor, "override must be finite")
if factor < 1.0 {
raise Selection("override factor must be at least one")
}
for j in 0..
out.push({
age,
factor,
pairs: 0,
skipped_zero: 0,
numerator: 0.0,
denominator: 0.0,
})
None =>
out.push(estimate_pair_column(triangle, age, average, excluded, recent))
}
}
out
}