---
tags:
  - api
  - exact
---

# 精确求解器接口兼容性

本页说明 `ModelBuilder` 接口在 CP-SAT 和 MILP 两种精确解模式下的支持范围。完整接口签名和示例见 [Builder API](builder.md)。

!!! warning "以完整表达式图为准"
    变量类型兼容不代表整个模型兼容。只要目标或约束中包含当前后端不支持的节点，精确解 lowering 仍会拒绝该模型。

## 标签

| 标签 | 含义 |
|---|---|
| <span class="solver-tag solver-tag--heuristic">HEURISTIC</span> | 启发式路径可评估或搜索该语义。 |
| <span class="solver-tag solver-tag--cpsat">CP-SAT</span> | 可进入当前 `cp_sat` 精确路径。 |
| <span class="solver-tag solver-tag--milp">MILP</span> | 可进入当前 `mathopt_mp` / `highs_cpp` 精确路径。 |
| <span class="solver-tag solver-tag--model">MODEL</span> | 建模、登记或导出接口，不直接决定后端支持。 |

## CP-SAT 模式

CP-SAT 当前适合整数、布尔、组合逻辑和调度结构。它不接收连续变量、集合变量、黑盒调用，也不支持所有序列操作。

### CP-SAT 支持

| 建模接口 | 支持条件 |
|---|---|
| [const](builder.md#optagent.ModelBuilder.const) | 参与 CP-SAT lowering 的常量必须是整数或布尔值。 |
| [bool_var](builder.md#optagent.ModelBuilder.bool_var) | 支持。 |
| [int_var](builder.md#optagent.ModelBuilder.int_var) | 必须有有限 `lb` / `ub`。 |
| [sequence_var](builder.md#optagent.ModelBuilder.sequence_var) | 支持绑定到 [no_overlap](builder.md#optagent.ModelBuilder.no_overlap) 的调度序列，或作为直接 `sequence_transition_sum(...)` objective 输入。 |
| [interval_var](builder.md#optagent.ModelBuilder.interval_var) / [optional_interval_var](builder.md#optagent.ModelBuilder.optional_interval_var) | 支持 mandatory / optional interval 的开始、结束、持续时间和 presence。 |
| [abs](builder.md#optagent.ModelBuilder.abs) | 支持整数表达式绝对值。 |
| [sum](builder.md#optagent.ModelBuilder.sum) | 支持整数表达式求和。 |
| [at_most_one](builder.md#optagent.ModelBuilder.at_most_one) / [at_least_one](builder.md#optagent.ModelBuilder.at_least_one) / [exactly_one](builder.md#optagent.ModelBuilder.exactly_one) | 支持布尔/整数输入上的计数关系。 |
| [min](builder.md#optagent.ModelBuilder.min) / [max](builder.md#optagent.ModelBuilder.max) | 支持整数表达式聚合。 |
| [and_](builder.md#optagent.ModelBuilder.and_) / [or_](builder.md#optagent.ModelBuilder.or_) / [not_](builder.md#optagent.ModelBuilder.not_) | 支持布尔表达式组合。 |
| [iif](builder.md#optagent.ModelBuilder.iif) | 支持整数条件选择，会降为 enforcement literal 约束和辅助整数变量。 |
| 比较表达式 `<=` / `>=` / `<` / `>` / `==` / `!=` | 支持整数和布尔上下文中的比较。 |
| [all_different](builder.md#optagent.ModelBuilder.all_different) | 支持。 |
| [interval_start](builder.md#optagent.ModelBuilder.interval_start) / [interval_end](builder.md#optagent.ModelBuilder.interval_end) / [interval_length](builder.md#optagent.ModelBuilder.interval_length) / [interval_presence](builder.md#optagent.ModelBuilder.interval_presence) | 支持 interval 派生标量和 presence。 |
| [selected_start](builder.md#optagent.ModelBuilder.selected_start) / [selected_end](builder.md#optagent.ModelBuilder.selected_end) / [selected_duration](builder.md#optagent.ModelBuilder.selected_duration) | 支持基于 presence 的 selected projection；调用方仍需用 exactly-one 约束保证唯一选择。 |
| [alternative](builder.md#optagent.ModelBuilder.alternative) / [add_alternative](builder.md#optagent.ModelBuilder.add_alternative) | 支持 exactly-one alternative。 |
| [cumulative](builder.md#optagent.ModelBuilder.cumulative) | 支持调度累积资源约束。 |
| [no_overlap](builder.md#optagent.ModelBuilder.no_overlap) | 支持，并负责把 `sequence_var` 绑定到 interval 组。 |
| [precedence](builder.md#optagent.ModelBuilder.precedence) | 支持前后工序约束。 |
| `sequence_transition_sum` | 支持 IR-owned dense integer path/cycle objective；要求直接作为 objective root、min sense、非负整数成本。 |
| [constraint](builder.md#optagent.ModelBuilder.constraint) / [minimize](builder.md#optagent.ModelBuilder.minimize) / [maximize](builder.md#optagent.ModelBuilder.maximize) | 登记接口可用；内部表达式必须属于 CP-SAT 支持范围。 |

### CP-SAT 不支持

| 建模接口 | 原因 |
|---|---|
| [float_var](builder.md#optagent.ModelBuilder.float_var) | 当前 CP-SAT 路径构建整数域模型，不接收连续变量。 |
| [set_var](builder.md#optagent.ModelBuilder.set_var)、[set_len](builder.md#optagent.ModelBuilder.set_len)、[set_contains](builder.md#optagent.ModelBuilder.set_contains) | 当前 canonical CP model 没有集合变量语义。 |
| [sequence_contains](builder.md#optagent.ModelBuilder.sequence_contains) | 仅动态 membership 不支持；常量 membership check 会按排列域静态 lowering。 |
| `sequence_transition_sum` sparse / forbidden / default-cost / score / non-min / negative or non-integer cost modes | 当前 CP-SAT exact slice 只支持 dense non-negative integer min path/cycle。 |
| [element](builder.md#optagent.ModelBuilder.element) / [table](builder.md#optagent.ModelBuilder.table) | 未接入 CP-SAT 原生 element/table 约束。 |
| [external_call](builder.md#external-call) | 精确解后端不能调用任意 Python 黑盒函数并证明全局最优。 |

## MILP 模式

MILP 当前是线性 MP lowering，适合布尔、整数、连续变量上的线性目标和线性约束。它不自动做调度、逻辑、集合、黑盒或非线性表达式改写。

### MILP 支持

| 建模接口 | 支持条件 |
|---|---|
| [const](builder.md#optagent.ModelBuilder.const) | 支持数值和布尔常量；不支持 list/dict 常量参与线性表达式。 |
| [bool_var](builder.md#optagent.ModelBuilder.bool_var) | 支持，降为 0/1 变量。 |
| [int_var](builder.md#optagent.ModelBuilder.int_var) | 支持整数变量，可带上下界。 |
| [float_var](builder.md#optagent.ModelBuilder.float_var) | 支持连续变量，可带上下界。 |
| [sum](builder.md#optagent.ModelBuilder.sum) | 支持线性求和。 |
| [at_most_one](builder.md#optagent.ModelBuilder.at_most_one) / [at_least_one](builder.md#optagent.ModelBuilder.at_least_one) / [exactly_one](builder.md#optagent.ModelBuilder.exactly_one) | 支持布尔变量上的线性计数关系。 |
| [alternative](builder.md#optagent.ModelBuilder.alternative) / [add_alternative](builder.md#optagent.ModelBuilder.add_alternative) | 支持布尔 presence 上的 exactly-one 线性关系。 |
| 加减与取负表达式 | 支持线性组合。 |
| 乘常量表达式 | 支持 `变量或线性表达式 * 常量`；不支持变量乘变量。 |
| 比较表达式 `<=` / `>=` / `==` | 支持线性比较。 |
| 严格比较 `<` / `>` | 仅当比较表达式可判定为整数时支持，会转为相差至少 1。 |
| [constraint](builder.md#optagent.ModelBuilder.constraint) / [minimize](builder.md#optagent.ModelBuilder.minimize) / [maximize](builder.md#optagent.ModelBuilder.maximize) | 登记接口可用；内部表达式必须为线性 MP 支持范围。 |

### MILP 不支持

| 建模接口 | 原因 |
|---|---|
| [set_var](builder.md#optagent.ModelBuilder.set_var)、[set_len](builder.md#optagent.ModelBuilder.set_len)、[set_contains](builder.md#optagent.ModelBuilder.set_contains) | 当前 canonical MP model 只包含标量变量和线性约束。 |
| [sequence_var](builder.md#optagent.ModelBuilder.sequence_var)、[sequence_contains](builder.md#optagent.ModelBuilder.sequence_contains) | 当前 MILP 路径不自动生成排列或路径 formulation。 |
| [interval_var](builder.md#optagent.ModelBuilder.interval_var)、[optional_interval_var](builder.md#optagent.ModelBuilder.optional_interval_var)、[interval_start](builder.md#optagent.ModelBuilder.interval_start)、[interval_end](builder.md#optagent.ModelBuilder.interval_end)、[interval_length](builder.md#optagent.ModelBuilder.interval_length)、[interval_presence](builder.md#optagent.ModelBuilder.interval_presence) | 当前 MILP 路径不接收 interval 结构。 |
| [selected_start](builder.md#optagent.ModelBuilder.selected_start)、[selected_end](builder.md#optagent.ModelBuilder.selected_end)、[selected_duration](builder.md#optagent.ModelBuilder.selected_duration) | 依赖 interval 和 `iif`，当前不做 MILP lowering。 |
| [abs](builder.md#optagent.ModelBuilder.abs) | 未自动改写为辅助变量和线性约束。 |
| [min](builder.md#optagent.ModelBuilder.min) / [max](builder.md#optagent.ModelBuilder.max) | 未自动生成 epigraph / hypograph 线性 formulation。 |
| [and_](builder.md#optagent.ModelBuilder.and_) / [or_](builder.md#optagent.ModelBuilder.or_) / [not_](builder.md#optagent.ModelBuilder.not_) / [iif](builder.md#optagent.ModelBuilder.iif) | 未自动做逻辑约束或 big-M 线性化。 |
| `!=` 比较 | 当前线性 MP lowering 不支持 disjunction。 |
| [all_different](builder.md#optagent.ModelBuilder.all_different) | 未自动构造 pairwise 或 assignment 线性化。 |
| [element](builder.md#optagent.ModelBuilder.element) / [table](builder.md#optagent.ModelBuilder.table) | 未自动线性化。 |
| [cumulative](builder.md#optagent.ModelBuilder.cumulative) / [no_overlap](builder.md#optagent.ModelBuilder.no_overlap) / [precedence](builder.md#optagent.ModelBuilder.precedence) | 调度结构当前不自动生成 MILP formulation。 |
| [external_call](builder.md#external-call) | 精确解后端不能调用任意 Python 黑盒函数并证明全局最优。 |

## 选择建议

| 模型特征 | 建议 |
|---|---|
| 纯线性目标和线性约束，包含连续变量 | 优先尝试 MILP。 |
| 整数、布尔、调度 interval、`no_overlap`、`cumulative` | 优先尝试 CP-SAT。 |
| 典型 JSSP/FJSP/RCPSP 建模 | 优先使用 [Scheduling API](scheduling.md) 表达任务、资源和 alternatives，再按模型结构选择 `solve(...)` 或 CP-SAT。 |
| 黑盒目标、集合变量、路线评分函数 | 优先使用 `solve(...)`，必要时显式声明 `GaConfig`。 |
| 同一模型同时包含线性和调度/黑盒结构 | 优先使用 `solve(...)` 的 strategy-first 路线；只有明确需要 exact backend 时再使用 direct exact API。 |
