# uff-relax への途中キャンセル機能追加の提案
## 1. 目的
ブラウザ(Wasm)環境等のインタラクティブなUIにおいて、長時間かかる最適化計算(特に全系Relaxation)をユーザーが任意のタイミングで中断できるようにし、アプリケーションの応答性を向上させる。
## 2. 変更内容の概要
`UffOptimizerb 構造体にスレッドセーフなキャンセル・フラグ(`AtomicBoolb)を保持する機能を追加し、計算ループの各ステップでその状態を監視する。
## 3. 具体的な実装仕様(案)
### A. 構造体の変更 (`src/optimizer.rsb)
`UffOptimizerb にフラグ保持用のフィールドを追加します。
```rust
pub struct UffOptimizer {
// ... 既存のフィールド ...
pub cancel_flag: Option<std::sync::Arc<std::sync::atomic::AtomicBool>>,
}
```
### B. ビルダーメソッドの追加
外部からフラグを注入するためのメソッドを追加します。
```rust
impl UffOptimizer {
pub fn with_cancel_flag(mut self, flag: std::sync::Arc<std::sync::atomic::AtomicBool>) -> Self {
self.cancel_flag = Some(flag);
self
}
}
```
### C. 計算ループ内でのチェック (`optimizeb および `optimize_asyncb)
`for iter in 0..self.max_iterations { ... }` ループの冒頭に以下のチェックを挿入します。
```rust
if let Some(ref cancel) = self.cancel_flag {
if cancel.load(std::sync::atomic::Ordering::SeqCst) {
tracing::info!("[Builder] Optimization cancelled by user.");
break; // ループを中断して正常終了またはフッター表示へ
}
}
```
## 4. 期待される動作
* フラグが `trueb に書き換えられた直後の Iteration ステップでループが終了する。
* `optimize_asyncb の場合、`yield_nowb と組み合わせることで、ブラウザのメインスレッドをブロックし続けることなく、即座にキャンセル処理が反映される。
* 既存の API 呼び出し(フラグを渡さない場合)には影響を与えない(後方互換性の維持)。