Spaces:
Sleeping
Sleeping
Commit
·
de4f1bc
1
Parent(s):
fd689ff
feat(task T-20251025-duration-slider-0-30): limit duration slider to 0–30 seconds
Browse files- UI: change gr.Slider range to 0–30, default 30
- Docs: update spec UI note; add change-log entry
- app.py +4 -1
- change-log.md +19 -0
- docs/task.md +68 -47
app.py
CHANGED
|
@@ -1178,7 +1178,10 @@ with gr.Blocks(title="TTSAM 震度預測系統") as demo:
|
|
| 1178 |
|
| 1179 |
with gr.Row():
|
| 1180 |
start_slider = gr.Slider(0, 300, value=0, step=1, label="開始時間 (秒)")
|
| 1181 |
-
|
|
|
|
|
|
|
|
|
|
| 1182 |
|
| 1183 |
gr.Markdown("### 震央位置")
|
| 1184 |
with gr.Row():
|
|
|
|
| 1178 |
|
| 1179 |
with gr.Row():
|
| 1180 |
start_slider = gr.Slider(0, 300, value=0, step=1, label="開始時間 (秒)")
|
| 1181 |
+
# 將時間長度滑桿限制為 0–30 秒,與模型固定窗口對齊;小於 30 秒將於尾段 0 填充
|
| 1182 |
+
duration_slider = gr.Slider(0, 30, value=30, step=1, label="時間長度 (秒)")
|
| 1183 |
+
# 說明:模型最多 30 秒;小於 30 秒會自動以 0 填充至 30 秒(3000 samples @ 100 Hz)
|
| 1184 |
+
gr.Markdown("> 模型最多 30 秒;小於 30 秒會自動以 0 填充至 30 秒(3000 samples @ 100 Hz)。")
|
| 1185 |
|
| 1186 |
gr.Markdown("### 震央位置")
|
| 1187 |
with gr.Row():
|
change-log.md
CHANGED
|
@@ -37,3 +37,22 @@
|
|
| 37 |
- 低;如需回滾,移除新增文檔即可。
|
| 38 |
- 連結
|
| 39 |
- Task: T-20251025-docs-workflow(規劃)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 37 |
- 低;如需回滾,移除新增文檔即可。
|
| 38 |
- 連結
|
| 39 |
- Task: T-20251025-docs-workflow(規劃)
|
| 40 |
+
|
| 41 |
+
## 2025-10-25 — UI 對齊不變條件:時間長度滑桿改為 0–30 秒
|
| 42 |
+
- Highlights
|
| 43 |
+
- 將 `app.py` 之「時間長度 (秒)」滑桿範圍由 1–60 調整為 0–30(預設 30)。
|
| 44 |
+
- 新增說明文字:模型最多 30 秒;不足 30 秒以 0 填充至 30 秒(100 Hz,共 3000 點)。
|
| 45 |
+
- Spec/契約影響
|
| 46 |
+
- 與 `docs/spec.md` 不變條件一致;無公共行為或 I/O 破壞性變更。
|
| 47 |
+
- 行為或 I/O 變更
|
| 48 |
+
- UI 限制使用者輸入於 0–30 秒;後端行為不變(既有 30 秒窗口與補齊)。
|
| 49 |
+
- 資料/站台檔影響
|
| 50 |
+
- 無。
|
| 51 |
+
- 降級與 Logging
|
| 52 |
+
- 維持原有:duration < 30 秒時記錄 INFO 並 0 填充;其他降級策略不變。
|
| 53 |
+
- 測試與驗收
|
| 54 |
+
- 手動冒煙:duration=0/5/30 均可載入與預測;看到不足 30 秒之補齊 log 與正常輸出。
|
| 55 |
+
- 風險與回滾
|
| 56 |
+
- 低;若需回復,可將滑桿改回 1–60(單行改動)。
|
| 57 |
+
- 連結
|
| 58 |
+
- Task: T-20251025-duration-slider-0-30
|
docs/task.md
CHANGED
|
@@ -1,21 +1,21 @@
|
|
| 1 |
-
# Task:
|
| 2 |
|
| 3 |
-
- Task ID: T
|
| 4 |
- Owner: <name>
|
| 5 |
-
- Date:
|
| 6 |
-
- Status: Planning
|
| 7 |
|
| 8 |
## 背景與目標
|
| 9 |
-
-
|
| 10 |
-
-
|
| 11 |
-
-
|
| 12 |
|
| 13 |
## 相關文件與位置
|
| 14 |
-
- 規格:`docs/spec.md
|
| 15 |
-
- 主程式:`app.py
|
| 16 |
-
- 即時樣板:`ttsam_realtime.py
|
| 17 |
-
- 站台資料:`station/site_info.csv`, `station/eew_target.csv
|
| 18 |
-
-
|
| 19 |
|
| 20 |
## 不變條件與約束(對齊 spec 要點)
|
| 21 |
- 取樣率固定 100 Hz;模型輸入固定 30 秒(3000 samples)。不足 30 秒時尾段 0 填充。
|
|
@@ -27,64 +27,85 @@
|
|
| 27 |
- `station/site_info.csv` 欄位:Station, Latitude, Longitude, Elevation。
|
| 28 |
- `station/eew_target.csv` 欄位:station, latitude, longitude, elevation。
|
| 29 |
|
| 30 |
-
>
|
| 31 |
|
| 32 |
## 任務拆解(可勾選,可跨對話沿用)
|
| 33 |
-
- [ ] 子任務 1
|
| 34 |
-
-
|
| 35 |
-
-
|
| 36 |
-
-
|
| 37 |
-
|
| 38 |
-
-
|
| 39 |
-
-
|
| 40 |
-
-
|
| 41 |
-
|
| 42 |
-
|
| 43 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 44 |
|
| 45 |
## 介面與資料形狀變更評估
|
| 46 |
-
- UI
|
| 47 |
-
- I/O shape
|
| 48 |
-
-
|
| 49 |
|
| 50 |
## 降級與記錄策略
|
| 51 |
-
-
|
| 52 |
-
-
|
| 53 |
-
-
|
|
|
|
|
|
|
| 54 |
|
| 55 |
## 測試與驗收
|
| 56 |
-
-
|
| 57 |
- 手動冒煙:
|
| 58 |
-
-
|
| 59 |
-
|
| 60 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 61 |
- 品質檢查(最低):
|
| 62 |
- [ ] Build/型別/格式檢查通過
|
| 63 |
-
- [ ] 關鍵邊界情境可正確降級並記錄 log
|
| 64 |
-
- [ ] 與 `docs/spec.md`
|
| 65 |
|
| 66 |
## 風險、回滾與後續
|
| 67 |
-
-
|
| 68 |
-
-
|
| 69 |
-
-
|
|
|
|
|
|
|
|
|
|
|
|
|
| 70 |
|
| 71 |
## 進度紀錄(跨對話追蹤)
|
| 72 |
-
-
|
| 73 |
|
| 74 |
---
|
| 75 |
|
| 76 |
附錄 A:Commit 信息模板
|
| 77 |
|
| 78 |
```
|
| 79 |
-
feat(task T
|
| 80 |
|
| 81 |
-
-
|
| 82 |
-
-
|
| 83 |
|
| 84 |
-
Refs: T
|
| 85 |
```
|
| 86 |
|
| 87 |
附錄 B:分支/PR 命名
|
| 88 |
-
- 分支:`feature/T
|
| 89 |
-
- PR 標題:`T
|
| 90 |
-
|
|
|
|
| 1 |
+
# Task: 將「時間長度」滑桿限制為 0–30 秒(與模型輸入窗口一致)
|
| 2 |
|
| 3 |
+
- Task ID: T-20251025-duration-slider-0-30
|
| 4 |
- Owner: <name>
|
| 5 |
+
- Date: 2025-10-25
|
| 6 |
+
- Status: Planning
|
| 7 |
|
| 8 |
## 背景與目標
|
| 9 |
+
- 背景:模型輸入固定為 30 秒(3000 samples @ 100 Hz),超過 30 秒並無實質效益,且小於 30 秒時會於尾段 0 填充。現行 UI 的「時間長度」滑桿範圍為 1–60 秒,與不變條件不一致,可能造成誤解。
|
| 10 |
+
- 目標:將 UI 的「時間長度 (秒)」滑桿範圍調整為 0–30 秒(含 0),與模型契約一致;0 代表完全依賴 0 填充(極端測試/早期秒數)。
|
| 11 |
+
- 不在範圍:不調整「開始時間」滑桿範圍;不改變內部資料管線與模型契約;不新增後端 API。
|
| 12 |
|
| 13 |
## 相關文件與位置
|
| 14 |
+
- 規格:`docs/spec.md`(Section 4, 5, 8)
|
| 15 |
+
- 主程式:`app.py`(Gradio UI:`duration_slider`)
|
| 16 |
+
- 即時樣板:`ttsam_realtime.py`(不需改)
|
| 17 |
+
- 站台資料:`station/site_info.csv`, `station/eew_target.csv`(不需改)
|
| 18 |
+
- 其他:`change-log.md`
|
| 19 |
|
| 20 |
## 不變條件與約束(對齊 spec 要點)
|
| 21 |
- 取樣率固定 100 Hz;模型輸入固定 30 秒(3000 samples)。不足 30 秒時尾段 0 填充。
|
|
|
|
| 27 |
- `station/site_info.csv` 欄位:Station, Latitude, Longitude, Elevation。
|
| 28 |
- `station/eew_target.csv` 欄位:station, latitude, longitude, elevation。
|
| 29 |
|
| 30 |
+
> 本任務僅限 UI 範圍,不改動上述契約與流程。
|
| 31 |
|
| 32 |
## 任務拆解(可勾選,可跨對話沿用)
|
| 33 |
+
- [ ] 子任務 1:調整 UI 滑桿範圍(變更檔案:`app.py`)
|
| 34 |
+
- 將 `duration_slider = gr.Slider(1, 60, value=30, step=1, label="時間長度 (秒)")` 改為 `gr.Slider(0, 30, value=30, step=1, label="時間長度 (秒)")`。
|
| 35 |
+
- 驗收標準:UI 顯示範圍為 0–30;預設值 30;無法選到 31–60;可選 0。
|
| 36 |
+
- 測試/冒煙:啟動 UI,檢查滑桿邊界值(0、30)與步階 1。
|
| 37 |
+
- [ ] 子任務 2:在 UI 增補說明文字(變更檔案:`app.py`)
|
| 38 |
+
- 在滑桿附近新增說明:「模型最多 30 秒;小於 30 秒會自動以 0 填充」。
|
| 39 |
+
- 驗收標準:說明文字出現在參數區域,語意清楚不遮蓋元件。
|
| 40 |
+
- 測試/冒煙:視覺檢查文字呈現;暗色/亮色主題下可讀性良好。
|
| 41 |
+
- [ ] 子任務 3:邊界秒數冒煙測試與 log 檢查(無程式碼變更)
|
| 42 |
+
- 使用 `duration=0, 5, 30` 分別跑「載入波形」與「執行預測」。
|
| 43 |
+
- 驗收標準:
|
| 44 |
+
- UI 不崩潰,能產出地圖與統計;輸入波形圖正常標註選取範圍(0 長度時兩條紅線重合)。
|
| 45 |
+
- Log 出現「時間長度 X 秒 < 30 秒,將以 0 遮罩補齊至 30 秒」訊息(X=0 或 5)。
|
| 46 |
+
- `stats_output` 包含開始/長度/震央資訊、使用測站數、缺分量統計、目標點數、最大震度。
|
| 47 |
+
- [ ] 子任務 4:文件同步與變更摘要(變更檔案:`docs/spec.md`, `change-log.md`)
|
| 48 |
+
- `docs/spec.md` Section 8「調整 UI」補充:時間長度滑桿限制 0–30 秒(與不變條件一致)。
|
| 49 |
+
- `change-log.md` 新增條目:說明 UI 變更與不變條件對齊,無破壞性行為變更。
|
| 50 |
+
- 驗收標準:文件語意清楚;不影響既有契約描述。
|
| 51 |
+
|
| 52 |
+
> 建議每個子任務都能在 1 小時內完成並可獨立驗收。
|
| 53 |
|
| 54 |
## 介面與資料形狀變更評估
|
| 55 |
+
- UI 影響:僅限滑桿範圍與說明文字;不新增欄位;不移除現有功能。
|
| 56 |
+
- I/O shape:不變。模型仍接收 (1, 25, 3000, 3) 的 waveform 與對應 station/target。
|
| 57 |
+
- 向後相容:是。先前可選擇 >30 秒的行為被 UI 限制,但屬於與契約對齊的矯正;後端早已固定裁切/補齊至 30 秒,故無破壞性變更。
|
| 58 |
|
| 59 |
## 降級與記錄策略
|
| 60 |
+
- 可能失敗點:無新增失敗點;仍沿用既有的 Vs30 下載失敗、缺分量、測站不足等。
|
| 61 |
+
- 降級方案:
|
| 62 |
+
- duration < 30 秒:尾段 0 填充(現有行為)。
|
| 63 |
+
- 實際震度圖缺失:顯示空白占位並記錄 warning(現有行為)。
|
| 64 |
+
- Logging:維持 `extract_waveforms_from_stream` 對不足 30 秒的 INFO 訊息與缺分量統計。
|
| 65 |
|
| 66 |
## 測試與驗收
|
| 67 |
+
- 單元/整合測試:本變更屬 UI 層;暫無自動化測試,採手動冒煙。
|
| 68 |
- 手動冒煙:
|
| 69 |
+
- 啟動方式:
|
| 70 |
+
- `./run_local.sh`(若已設定)或
|
| 71 |
+
- `python app.py`
|
| 72 |
+
- 驗收步驟:
|
| 73 |
+
1) 確認「時間長度」滑桿範圍為 0–30,預設 30。
|
| 74 |
+
2) 分別設定 duration=0、5、30,按「📊 載入波形」,檢查波形圖與範圍標註。
|
| 75 |
+
3) 按「🔮 執行預測」,檢查預測地圖、`stats_output` 文字摘要、log 訊息。
|
| 76 |
+
- 預期結果:
|
| 77 |
+
- 0/5 秒均能正常運作並顯示補齊提示;30 秒顯示完整窗口。
|
| 78 |
+
- 對目標測站分批推論正常,地圖高度為 800px。
|
| 79 |
- 品質檢查(最低):
|
| 80 |
- [ ] Build/型別/格式檢查通過
|
| 81 |
+
- [ ] 關鍵邊界情境可正確降級並記錄 log(duration=0,5)
|
| 82 |
+
- [ ] 與 `docs/spec.md` 之契約一致(0–30 秒 UI 約束)
|
| 83 |
|
| 84 |
## 風險、回滾與後續
|
| 85 |
+
- 風險:
|
| 86 |
+
- 使用者既有習慣可能嘗試 >30 秒,需透過說明文字降低困惑。
|
| 87 |
+
- 回滾:
|
| 88 |
+
- 若需回復,可將滑桿範圍改回 1–60(單一行變更),不影響後端。
|
| 89 |
+
- 後續工作:
|
| 90 |
+
- 視需求新增「快速鍵/按鈕」切換常用窗口(如 5s/10s/20s/30s)。
|
| 91 |
+
- 可考慮將 0–30 秒改為步階 0.5 秒,提供更細控制(需再評估)。
|
| 92 |
|
| 93 |
## 進度紀錄(跨對話追蹤)
|
| 94 |
+
- 2025-10-25 10:00:建立 task 草案,確認不影響後端契約與流程。
|
| 95 |
|
| 96 |
---
|
| 97 |
|
| 98 |
附錄 A:Commit 信息模板
|
| 99 |
|
| 100 |
```
|
| 101 |
+
feat(task T-20251025-duration-slider-0-30): limit duration slider to 0–30 seconds
|
| 102 |
|
| 103 |
+
- UI: change gr.Slider range to 0–30, default 30
|
| 104 |
+
- Docs: update spec UI note; add change-log entry
|
| 105 |
|
| 106 |
+
Refs: T-20251025-duration-slider-0-30
|
| 107 |
```
|
| 108 |
|
| 109 |
附錄 B:分支/PR 命名
|
| 110 |
+
- 分支:`feature/T-20251025-duration-slider-0-30`
|
| 111 |
+
- PR 標題:`T-20251025-duration-slider-0-30: limit duration slider to 0–30 seconds`
|
|
|