Skip to content

二次区间指示 ​

QuadraticInStepRangeFunction 是闭区间门控函数,不是 floor 或按步长取整函数。设二次多项式为 p(x),且 L≤U,区间外分类容差为 ε>0:

gε(p)={p(x),L≤p(x)≤U,0,p(x)≤L−ε 或 p(x)≥U+ε,未定义,其他情况.

未定义带显式说明了连续域的边界契约:严格补集无法由有限个非严格不等式精确编码。两种实现都创建三个互斥的二值指示变量 zin、zlow、zhigh,以及有符号结果变量 y。取正的 Big-M 常数 M,求解器模型为:

p(x)−Mzin≥L−M,p(x)+Mzin≤U+M,p(x)+Mzlow≤L−ε+M,p(x)−Mzhigh≥U+ε−M,zin+zlow+zhigh=1,y−p(x)−Mzin≥−M,y−p(x)+Mzin≤M,y−Mzin≤0,y+Mzin≥0.

三状态 one-hot 划分保证:[L,U] 内只能选择 inside 分支,低于或等于 L−ε 时选择 low 分支,高于或等于 U+ε 时选择 high 分支。最后四条约束仅在 inside 分支令 y=p(x),其他分支令 y=0。

API ​

kotlin
val p = QuadraticPolynomial(
    monomials = listOf(QuadraticMonomial.quadratic(Flt64.one, x, x)),
    constant = Flt64.zero
)
val f = QuadraticInStepRangeFunction(
    x = p,
    lower = Flt64.zero,
    upper = Flt64(4.0),
    bigM = Flt64(100.0),
    outsideTolerance = Flt64(1e-6),
    converter = IntoValue.Identity,
    name = "square_gate"
)
rust
let p = Quadratic::new(
    vec![QuadraticMonomial::new_quadratic(1.0, x_index, x_index)],
    0.0,
);
let f = QuadraticInStepRangeFunction::with_parameters(
    11, "square_gate", p, 0.0, 4.0, 100.0, 1e-6,
);

旧 Rust 步长取整构造器以及 with_quadratic_bounds API 已删除。如果数学含义确实是 L+|s|⌊(U−L)/|s|⌋,应使用独立的 floor 函数。

求值与注册 ​

求值在闭区间内返回输入,在区间外容差之外返回零,在两侧未定义容差带内返回 null/None。注册时加入三个二值指示变量和有符号结果辅助变量,并提交九条约束。输入只有线性项时通过线性机制模型提交;包含二次项时通过二次机制模型提交。

测试与源码 ​

相关页面 ​