Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Feature/batch generation optimization - #6

Open
leoxie2006 wants to merge 6 commits into
IAMAI-Dev:mainfrom
leoxie2006:feature/batch-generation-optimization
Open

leoxie2006 wants to merge 6 commits into
IAMAI-Dev:mainfrom
leoxie2006:feature/batch-generation-optimization

Conversation

@leoxie2006

Copy link
Copy Markdown
Contributor

变更说明

  • 批量生成数据时支持选择每周跑的天数(星期),替代固定小时间隔
  • 每次生成的距离和时长支持自定义误差范围,让批量数据更加自然
  • 提取核心算法到独立模块,新增 30 个单元测试

关联 Issue

修改内容

新增 fit_algorithms.py — 核心算法模块

  • next_run_date():根据选中星期计算下一条记录的日期
  • calculate_base_params():配速 → 心率/步频参数映射
  • track_point():操场绕圈轨迹点 GPS 坐标生成
  • 所有操场几何常量

修改 main.py — UI 与生成逻辑

  • 每周跑的天数:一排复选框(一~日),仅在「生成份数 > 1」时显示
    • 勾选后首条记录自动对齐到最近的选中星期
    • 后续每条记录跳到下一个选中日期,自动处理跨周
    • 不勾选时完全保持原有的固定小时间隔行为(向后兼容)
  • 距离误差 (±km)时长误差 (±min):两条输入框,同样仅在「生成份数 > 1」时显示
    • 每条记录在基准值上叠加 random.uniform(-error, +error)
    • 距离下限兜底 0.01km,时长下限兜底 1min
    • 每条记录独立重新计算配速、心率、步频等参数
  • 日志中输出实际生成的距离/时长,方便核对
  • 代码从 fit_algorithms 导入纯逻辑,UI 层不再包含算法实现

新增 test_main.py — 30 个单元测试

测试类 数量 覆盖内容
TestNextRunDate 8 当天匹配、次日推进、跨周、多选、全选、空列表、时分秒保持、两周序列
TestCalculateBaseParams 5 快/中/慢配速档位、极短距离、同 seed 确定性
TestTrackPoint 7 返回值类型、起终点位置校验、不同 seed/progress 差异、高纬/赤道边界
TestErrorRangeRandomization 6 距离/时长误差边界、零误差精确值、大误差最小值兜底、分布中位数
TestBackwardCompatibility 4 不选天数→interval 模式、选天数→schedule 模式、count=1 行为、默认误差为 0

测试情况

  • 30/30 单元测试全部通过(python3 -m unittest test_main -v
  • python3 -c "import ast; ast.parse(open('main.py').read()); print('Syntax OK')" 语法检查通过
  • 已手动运行 uv run main.py 验证 GUI 交互

补充说明

使用示例

  1. 设置距离 5.0 km、时长 30 min
  2. 生成份数设为 8
  3. 勾选「一 二 三 四」(每周跑四天)
  4. 距离误差设为 0.1 km、时长误差设为 2 min
  5. 点击生成 → 会生成 8 条记录,分布在接下来两周的周一至周四,每条的距离在 4.95.1km、时长在 2832min 之间随机微调

向后兼容

  • 不勾选任何星期 + 误差均为 0 → 行为和原来完全一致
  • 旧的使用方式不受任何影响

- 新增「每周跑的天数」复选框(一~日),可选择只在特定星期几生成数据
- 新增「距离误差(±km)」和「时长误差(±min)」输入框,每条记录在误差范围内随机微调
- 选择天数后自动按星期对齐首条记录起始日期
- 每条记录独立计算基准参数(心率/步频),适配随机化后的距离和时长
- 新增选项仅在生成份数 > 1 时显示,不影响单条记录的使用体验
- 新增 fit_algorithms.py:包含 next_run_date、calculate_base_params、track_point 等纯逻辑函数
- main.py 改为从 fit_algorithms 导入,移除内联的算法实现
- 新增 test_main.py:30 个单元测试,覆盖星期调度、配速映射、轨迹点生成、误差随机化、向后兼容
- 所有测试通过(无需 Tkinter,可在任何环境运行)
Copilot AI review requested due to automatic review settings July 1, 2026 01:39

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

该 PR 为批量生成 FIT 数据的流程增加“按星期调度”和“距离/时长误差随机化”能力,并将与 UI 解耦的核心算法提取到独立模块,以提升可复用性与可测试性。

Changes:

  • 新增星期调度 next_run_date(),用于按选中星期推进下一条记录日期
  • 批量生成时支持距离/时长误差范围随机化,并对每条记录重新计算配速相关参数
  • 抽离核心算法到 fit_algorithms.py,并新增 test_main.py 覆盖主要逻辑

Reviewed changes

Copilot reviewed 3 out of 3 changed files in this pull request and generated 6 comments.

File Description
fit_algorithms.py 新增纯算法模块:星期调度、配速参数映射、操场轨迹点生成与常量抽离
main.py GUI 增加批量高级选项(星期/误差),并在生成线程中应用调度与随机化逻辑;算法改为从新模块导入
test_main.py 新增单元测试,覆盖星期调度/配速映射/轨迹点等;包含对误差与兼容性的测试用例框架

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread main.py Outdated
Comment thread main.py
Comment on lines +527 to +532
self.error_dur_label.grid(
row=5, column=1, sticky="e", padx=(0, 100),
)
self.error_dur_entry.grid(
row=5, column=2, sticky="w",
)
Comment thread fit_algorithms.py
Comment on lines +31 to +38
if current_dt.weekday() in selected_days:
return current_dt
for offset in range(1, 8):
candidate = current_dt + timedelta(days=offset)
if candidate.weekday() in selected_days:
return candidate
# 兜底:理论上不会到这里(7 天内必定找到匹配或回到同一天)。
return current_dt + timedelta(days=1)
Comment thread test_main.py
Comment on lines +227 to +229
class TestErrorRangeRandomization(unittest.TestCase):
"""验证距离/时长误差范围的随机化逻辑。"""

Comment thread test_main.py
Comment on lines +294 to +296
class TestBackwardCompatibility(unittest.TestCase):
"""验证未启用新功能时行为和原来一致。"""

Comment thread main.py
Comment on lines +18 to +23
from fit_algorithms import (
EARTH_METERS_PER_DEGREE,
calculate_base_params,
next_run_date,
track_point,
)
Co-authored-by: Copilot Autofix powered by AI <[email protected]>

@IAMAI-Dev IAMAI-Dev left a comment

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

感谢这次功能改进。星期调度、误差范围和算法模块拆分的方向很好,我在本地验证了 30 个测试、Python 编译、星期调度和实际 FIT 文件生成,主体功能可以运行。

合并前请处理或说明以下问题:

  1. start_generation() 会先解析距离/时长误差输入,再在 count <= 1 时将其清零。用户在批量模式中输入非数字内容后,如果将生成份数改回 1,输入框虽然已经隐藏,单条生成仍会报数字转换错误。请仅在 count > 1 时读取和校验这些高级选项。

  2. 旧版本会为整批文件计算一次心率/步频基准;当前实现即使误差为 0,也会为每个文件重新随机计算。这与 PR 中“行为和原来完全一致”的说明不符。请确认设计意图:

    • 如果需要严格向后兼容,请在零误差时复用批次基准;
    • 如果逐文件随机是有意的新行为,请修正兼容性说明。
  3. 当前误差和向后兼容测试没有调用 start_generation() 或 _run_task(),主要是在测试标准库和局部变量,无法覆盖以上场景。请补充至少覆盖隐藏输入和零误差行为的真实业务逻辑测试。

修改完成后请重新请求审核。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants