---
title: "规划目标"
description: "一次调用固定 FLOPs 与 read/write complexity 的权重，并让候选排名、改进阶段和最终选择使用同一目标。"
eyebrow: "核心概念"
---

## 完整路径的评分公式 {#definition}

公开 `PlannerObjective` 比较完整路径的总 FLOPs `F(P)` 与 total read/write complexity `R(P)`。默认权重为 `flops_weight=1`、`read_write_weight=64`。

```diagram
planner-objective
路径按加权目标 J(P) 比较，报告中记录 log₂ J(P)。默认权重为 (1, 64)。
```

| 权重 | 目标标签 | 比较内容 |
| --- | --- | --- |
| (1, 64) | flops\_read\_write | 默认加权目标 |
| (1, 0) | total\_flops | 只比较总 FLOPs |
| (0, 1) | total\_read\_write | 只比较 total read/write complexity |

> **权重的含义**
>
> 权重必须有限、非负，并且不能同时为 0。权重 64 是规划模型中的相对系数，不是字节数、缓存行大小或机器实测带宽。

## 一次调用只使用一套目标 {#one-objective-per-call}

权重在寻路入口确定。各生成器可以采用不同的局部启发式，但完整候选、树改进和最终选择使用同一个 `PlannerObjective`。

| 阶段 | objective 的作用 |
| --- | --- |
| random\_greedy | 比较多个完整 trial 的结果 |
| bisect | 比较多个完整递归二分 trial 的结果 |
| reconfigure\_path | 只接受 objective 严格改善的局部重构结果 |
| anneal\_path(s) / temper\_path(s) | 比较搜索中的完整树状态与最终结果 |
| 切片候选 | 在满足硬约束的方案之间比较总工作量 |

> **候选生成规则与顶层目标**
>
> random-greedy 的局部代价、图划分目标或退火中的 proposal 机制负责生成候选，并非新的顶层 objective。生成完整候选路径后，仍按本次调用的 `PlannerObjective` 排名。

## 在 Python 中指定权重 {#usage}

```python
from arctn import arctn_schedule

# 默认：FLOPs + 64 * read/write complexity
default_report = arctn_schedule(
    inputs, output, size_dict,
    flops_weight=1.0, read_write_weight=64.0,
)

# 纯 FLOPs
flops_report = arctn_schedule(
    inputs, output, size_dict,
    flops_weight=1.0, read_write_weight=0.0,
)
```

改变权重可能改变完整候选的排名、局部改进的接受结果和最终返回路径。搜索所用 objective 才是该次运行实际优化的目标。

| 报告字段 | 含义 |
| --- | --- |
| planner\_objective | 本次调用使用的目标标签；权重分别由 flops\_weight 和 read\_write\_weight 字段报告 |
| planner\_objective\_score\_log2 | 最终返回计划加权目标的 log2；启用切片时计入全部切片 |
| log10\_flops / log2\_read\_write | 返回路径在未切片网络上的指标；启用切片后，全部切片的总量分别读取 sliced\_log10\_flops\_total 和 planner\_log2\_read\_write |

## 目标、约束与报告指标 {#objective-versus-constraints}

| 概念 | 回答的问题 | ArcTN 中的例子 |
| --- | --- | --- |
| 规划目标 | 多个合法方案中哪一个更好 | `F + 64R` 或调用者指定的非负权重 |
| 硬约束 | 一个方案是否允许返回 | `target_size` 对单片二元结果的上限；单张量网络检查最终输出 |
| 生成方法 | 候选从哪里来 | random-greedy、bisection |
| 报告指标 | 路径还有哪些结构特征 | `log2_peak_size`、`log2_total_size` |

指定切片腿后，切片数量是这些腿维度的乘积。ArcTN 对切片方案的结构目标按“单片工作量 × slice 数量”比较，因此在 log2 域给单片 objective 加上 `log2_n_slices`。

```text
n_slices = product(dim(leg) for leg in sliced_legs)
J_sliced = n_slices * J(one_slice)
log2(J_sliced) = log2(J(one_slice)) + log2(n_slices)
```

> [!WARNING]
> **硬约束优先**
>
> `target_size` 是接口所检查结果大小的硬上限；只有满足限制的方案进入最终 objective 比较，软惩罚不能替代最终可行性复核。
