Skip to content

步进区间 ​

InStepRangeFunction 返回不超过上界表达式的最大步进点:

y=lb+⌊ub−lbstep⌋step

它是数值步进函数,不是布尔成员测试。step 必须是有限正数;求值和注册约束时会拒绝 ub < lb。

求解器数学模型 ​

令 d=ub−lb、k=⌊d/step⌋、y=lb+stepk。求解器接收委托 FloorFunction 的 k 约束,以及显式顺序约束

ub−lb≥0

商在取整前会除以 step;因此下界 1、上界 10、步长 3 时结果是 10,下界 1、上界 9 时结果是 7。

Kotlin API ​

kotlin
val stepped = InStepRangeFunction(
    lb = lower,
    ub = upper,
    step = Flt64(3.0),
    converter = IntoValue.Identity,
    name = "stepped"
)

Rust API ​

Rust 现在提供相同的数值函数:

rust
let stepped = InStepRangeFunction::new(
    1, "stepped", lower, upper, 3.0_f64,
);

原先的网格成员函数已经明确命名为 InStepRangeIndicatorFunction;只有在需要“是否为网格点”的二元结果时才使用它。

Kotlin/Rust 示例 ​

kotlin
val stepped = InStepRangeFunction(
    lb = LinearPolynomial(emptyList(), Flt64(1.0)),
    ub = LinearPolynomial(emptyList(), Flt64(10.0)),
    step = Flt64(3.0),
    converter = IntoValue.Identity,
    name = "stepped"
)
check(stepped.evaluate(emptyMap()) == Flt64(10.0))
rust
let stepped = InStepRangeFunction::new(1, "stepped", lower, upper, 3.0_f64);
assert_eq!(stepped.calculate_value(&tokens, false), Some(10.0));

测试与参考 ​

独立聚焦测试会断言数值函数的两个 Floor 辅助变量和四条注册约束,以及成员函数的七个辅助变量和十六条点/OR 约束;同时覆盖网格端点、缺失输入及非法 step/Big-M。

端点函数移除了未使用的 Big-M 参数,因为 FloorFunction 不需要 Big-M。 InStepRangeIndicatorFunction 已在 Kotlin 和 Rust 两端提供成员测试,并统一使用 1e-10 边界 epsilon。Kotlin 使用可选的 bigM 构造参数;Rust 在需要显式有限正值时使用 InStepRangeIndicatorFunction::with_big_m,否则 new 遵循令牌推导/默认策略。