Files
MCM-ICM_Toolkit/docs/dev/function-card-template.md
guzhujushi 5319589dfd chore: 初始化 MCM/ICM Toolkit 仓库骨架
审查并精简 ChatGPT 的建库建议后落地的第一版骨架,只定接口不写实现。

- 建议审查:14 个包 → 7 个;约 250 个函数 → 约 40 个;5 个 Result 类 → 1 个
  (docs/01-suggestion-review.md)
- docs/:架构、路线图(含永久不做清单)、环境、Git 工作流、函数卡片模板
- src/mcm_toolkit/:core / data / stats / models / solve / decision / viz
  共 23 个模块,均为签名 + docstring + NotImplementedError
- tests/:9 个文件,其中 test_api_surface.py 已通过(20 passed)
- examples/ problems/ notebooks/ figures/ tables/ 骨架
- pyproject.toml(核心依赖 4 个 + 6 组 extras)、environment.yml
- scripts/:setup-venv.ps1(ASCII + LF)、setup-conda.ps1、doctor.ps1
- 环境:.venv(system-site-packages)与 conda 环境 mcm-toolkit 均已建好,
  数值栈版本与 base 完全对齐(numpy 2.4.6 / scipy 1.18.1 / pandas 3.0.6,MKL 后端)
2026-10-01 17:43:48 +08:00

4.0 KiB
Raw Permalink Blame History

S 档「函数卡片」模板

只给 S 档用(约 15 个招牌算法,见 docs/03-roadmap.md §3.1)。 其余 A 档函数只要求 docstring 一句话 + 一条 pytest,不写卡片。

卡片写在哪:docs/algorithms/<函数名>.md。 为什么写:S 档是自己实现、以后会去改内部实现的算法, 卡片是"半年后还看得懂当时为什么这么写"的唯一保障。


卡片模板

# <函数名>

| 项 | 内容 |
|---|---|
| 模块 | `mcm_toolkit.<包>.<模块>` |
| 档位 | S |
| 参考来源 | <教材 / 论文 / 库;自己实现时参考了什么> |

## 1. 数学定义

<公式。用 LaTeX 写,例如 \`\\hat{\\theta}^* = \\arg\\min_\\theta ...\`。
一句话说清输入输出分别是什么数学对象。>

## 2. 适用场景

**用**:<什么题型、什么数据条件下该用它>
**不用**:<什么条件下它失效或不该用>

## 3. 参数与返回值

| 参数 | 类型 | 默认 | 含义 | 取值影响 |
|---|---|---|---|---|
| | | | | |

返回 `Result`:

| 字段 | 内容 |
|---|---|
| `params` | |
| `metrics` | |
| `data` | |

## 4. 复杂度

- 时间:`O(...)`
- 空间:`O(...)`
- **什么时候会跑不完**:<给出具体数字量级,例如"n > 1e6 时内存 8GB 打不住">

## 5. 数值稳定性

<浮点误差、除零、log(0)、上溢下溢、病态矩阵……
写清"什么输入会出问题"和"代码里怎么防的"。>

## 6. 常见错误

1. <错误用法> → <后果> → <正确做法>
2. …

## 7. 最小示例

```python
# 能直接复制进 notebook 跑通的 5~15 行

8. 单元测试要点

测什么 期望
<已知解析解> <精度要求>
<边界输入> <行为>

9. MCM/ICM 用法

  • 哪类题:<例如"评价类 / 预测类 / 优化类">
  • 论文里怎么表述:<一句话,能直接改写成论文的"方法"小节>
  • 图:<配哪张图,用哪个 viz 函数>
  • 踩坑提醒:<评审最可能质疑什么>

---

## 示例:`bootstrap_ci` 的卡片(示范,未定稿)

```markdown
# bootstrap_ci

| 项 | 内容 |
|---|---|
| 模块 | `mcm_toolkit.stats.bootstrap` |
| 档位 | S |
| 参考来源 | Efron (1979); Efron & Tibshirani (1993) *An Introduction to the Bootstrap* |

## 1. 数学定义

给定样本 \`x_1..x_n\` 与统计量 \`T(·)\`,从 \`x\` 中有放回抽 \`n\` 个得到 \`x^*\`,
重复 \`B\` 次得 \`T^*_1..T^*_B\`。百分位法区间为
\`[T^*_{(α/2·B)}, T^*_{(1-α/2)·B}]\`。

## 2. 适用场景

**用**:统计量没有解析分布(中位数、极差、自定义指标)、样本有偏、想给区间但不想假设正态。
**不用**:\`n < 10\`(经验分布不可靠);数据有强时间相关性时(要用 block bootstrap)。

## 3. 参数与返回值

| 参数 | 类型 | 默认 | 含义 | 取值影响 |
|---|---|---|---|---|
| `statistic` | callable | `np.mean` | 任意 `f(sample) -> float` | 换 `np.median` 就得到中位数的 CI |
| `n_resamples` | int | 10000 | 重采样次数 `B` | 越大区间端点越稳;10000 通常够 |
| `confidence` | float | 0.95 | 置信水平 | |
| `method` | str | `"percentile"` | `"percentile"` / `"bca"` | BCa 更准但慢 |

## 4. 复杂度

时间 \`O(B·n)\`;空间 \`O(B)\`(**按块处理,不落地 B×n 矩阵**)。
`n=1e6, B=1e4` 约 \`1e10\` 次操作 → **跑不完**,此时应改用解析近似或降 `B`。

## 7. 最小示例

\`\`\`python
import numpy as np
from mcm_toolkit.stats import bootstrap_ci
r = bootstrap_ci(heights, statistic=np.median, n_resamples=10000, random_state=42)
print(r.params["low"], r.params["high"])
\`\`\`

## 9. MCM/ICM 用法

- **哪类题**:任何要"给结论 + 给不确定性"的题,尤其评价类和预测类。
- **论文里怎么表述**:"采用非参数 bootstrap(B=10000,seed=42)估计中位数的 95% 置信区间。"
- **图**:预测曲线 + 阴影区间;用 `viz.plot`。
- **踩坑提醒**:必须报 `B` 和 seed;BCa 与 percentile 结果不同时要说明选了哪个及理由。