Commit Graph
9 Commits
Author SHA1 Message Date
guzhujushi 3cdbba4cfb test(data): 拆掉模块级 skip,给 load_table/save_table 补 8 条行为测试
原来 tests/test_data.py 顶上一条 pytestmark 把整个文件跳过了,
连已经写好的 load_table 也一起跳——等于零覆盖。

- 改成逐条 @pytest.mark.skip,只标 5 个未实现的算法
- load_table 补:UTF-8 不被误读成 GBK、NA/-/#N/A 归 NaN、
  显式 encoding 优先、未知后缀抛 ValueError、缺文件抛带路径的报错
- save_table 补:往返读写返回 Path、非 DataFrame 抛 TypeError
- 测试数 31 passed / 45 skipped -> 39 passed / 44 skipped
2026-10-01 23:11:47 +08:00
guzhujushi 98278edd77 docs: 新增「类型约定」章节(架构 §4.7)
把"数据类型必须明确"从口头要求变成仓库规则,每个函数都适用。

- 判断顺序表:整数用 (int, np.integer)、浮点用 (float, np.floating)、
  bool 要放在 int 判断之前、数组先 np.asarray 归一化
- 硬规则:非法类型必须 raise TypeError,不许静默兜底
  (静默的后果是"种子被忽略、结果不可复现且无提示",最难查)
- 要求每个公开函数写全 Parameters(含 None 走哪条分支)与 Raises
- docs/03-roadmap.md §3.2 开发纪律加一行指针
2026-10-01 20:04:32 +08:00
guzhujushi c93810ffb1 fix(core): 补齐 get_rng 类型校验,set_seed 覆盖 numpy 旧全局
get_rng 的"共享单例生成器"设计由用户本人提出,本提交只在其上修 bug。

- random_state 判断从 isinstance(x, int) 放宽到 (int, np.integer):
  np.int64 不是 int 的子类,之前会静默退回全局流、种子被无声忽略
- 非预期类型改成抛 TypeError(含 bool / float / str / list),不再静默降级
- get_rng 签名补上 np.integer 与 Generator,与 docstring 的承诺一致
- set_seed 同时调用 np.random.seed:sklearn / statsmodels 走的是 numpy
  旧全局状态,不覆盖它们"提交能重跑"就有洞(带 noqa: NPY002 与理由)
- 测试:TestRandom 由 4 条增到 7 条(np.integer、非法类型、共享生成器推进)
- 新增 docs/dev/personal-pitfalls.md:个人易错点清单,只追加、不通读,
  首批记录本轮 4 个点;docs/README.md 补上 05 与该文件的索引
- STATUS.md:L0 进度说明更新,决策 24 改写(共享单例)、新增决策 25
  (src/ 实现默认由用户本人写)
2026-10-01 19:38:59 +08:00
guzhujushi 658b266614 feat(core): 实现 get_rng 与 set_seed
L0 第 2 项落地。

- get_rng(int) 固定种子可复现;get_rng(Generator) 原样透传;
  get_rng() 跟随 set_seed 设过的全局种子,没设过则交给系统熵源
- set_seed(seed) 除记录 _GLOBAL_SEED 外,还调用 np.random.seed,
  让 sklearn / statsmodels 这些走 numpy 旧全局状态的库也能复现;
  这是全项目唯一碰旧接口的位置,标注了 noqa: NPY002 与理由
- 已知取舍写进 docstring:同一全局种子下多次 get_rng() 是同一条流
- tests/test_core.py:TestRandom 去掉 skip;把原来那条自证式的
  test_set_seed_makes_global_reproducible 换成两条真断言
  (不传 random_state 也要可复现、旧全局状态被覆盖)
- STATUS.md:L0 进度 2/12,新增决策 23(允许 set_seed 碰旧接口)
  与 24(不做 SeedSequence.spawn 拆分);CHANGELOG.md 同步
2026-10-01 19:19:15 +08:00
guzhujushi cb96c847dd feat(core): 实现 Result 的 __repr__ 与 summary
L0 第 1 项落地。

- __repr__:单行紧凑;data 只给类型与规模(ndarray(100000)),
  绝不整数组打印;__repr__ 永不抛异常
- summary():可直接贴进论文的 Markdown 表格,
  行序 success → params.* → metrics.* → extras.*(按插入顺序,不排序),
  float 走 .6g,竖线转义,message 以引用行附在表后
- 新增 5 个模块级私有辅助:_fmt_scalar / _fmt_cell / _fmt_mapping /
  _describe_data / _truncate
- tests/test_core.py:去掉 test_result_repr_is_readable 的 skip,
  并补 3 条行为测试(默认值与失败路径与十万级数组、Markdown 结构、幂等)
- STATUS.md:L0 进度 1/12;新增决策 21(repr 不打印 data 内容)、
  22(summary 行序不排序);CHANGELOG.md 同步
2026-10-01 18:48:43 +08:00
guzhujushi bcdbdd35a3 docs: 记录 Gitea 远端接入方式
- STATUS.md:Gitea 接入标记完成,补充远端/分支/推送通道信息;
  新增决策 19(SSH 走 Tailscale 内网)与 20(首次推送 force-with-lease 的取舍)
- docs/05-git-workflow.md:第三节改写为实际拓扑(公网 22 被过滤、
  走 Tailscale + ~/.ssh/config 域名别名),补自检、日常推送、换机步骤,
  并保留仓库归属注意、补充可见性与协作者说明;
  回滚一节记录被覆盖提交的恢复命令
2026-10-01 17:56:12 +08:00
guzhujushi 96080b9dcc docs: 保留 Gitea 初始 README 的手写说明
远端 Initial commit 的 README 里有一句手写的仓库简介("这是我参加美赛时用的
学习和准备复用的代码,有需要可以自行克隆和修改"),并入本仓库 README 顶部,
避免首次推送覆盖它时丢失这句说明。
2026-10-01 17:53:50 +08:00
guzhujushi 1aca8680fb docs: 让文档与环境/仓库真实状态一致
- STATUS.md:补 D. Git 仓库小节(init/首次提交/行尾复核);
  环境版本按实测复核更新(venv 已随 base 升到 numpy 2.4.6 等);
  遗留项改为「Gitea 远程待配置」并记录沙箱账户的文件所有权副作用;
  新增决策 17(.git 由本人账户重建,不做 safe.directory 豁免)
  与 18(仓库级 core.autocrlf=false)
- docs/05-git-workflow.md:开头改为「已初始化,待配远程」;
  新增 §4 仓库归属注意,说明 dubious ownership 的成因与正确处置
- README.md:conda 脚本说明由「clone base,离线」更正为「精准包列表」;
  补一行仓库状态
2026-10-01 17:45:54 +08:00
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