swarm-engine-core 0.1.6

Core types and orchestration for SwarmEngine
Documentation
//! Selection Statistics - 探索ノード選択の統計管理
//!
//! ノード選択に必要な統計情報を管理する。
//!
//! # 設計
//!
//! 統計情報は `SwarmStats`(collector/stats.rs)が Single Source of Truth。
//! このモジュールの `NodeStats` は後方互換のために残しているが、
//! 実際には `SwarmStats::ActionStats` を使用する。
//!
//! - `NodeStats`: 個別ノードの成功/失敗統計(後方互換)

// ============================================================================
// Node Statistics - ノードの実行統計
// ============================================================================

/// ノードの実行統計
///
/// UCB1/Thompson で使用する成功/失敗カウント。
#[derive(Debug, Clone, Default)]
pub struct NodeStats {
    /// 訪問回数
    pub visits: u32,
    /// 成功回数
    pub successes: u32,
    /// 失敗回数
    pub failures: u32,
    /// 発見した子ノード数の合計
    pub discoveries: u32,
}

impl NodeStats {
    pub fn new() -> Self {
        Self::default()
    }

    /// 成功を記録
    pub fn record_success(&mut self) {
        self.visits += 1;
        self.successes += 1;
    }

    /// 失敗を記録
    pub fn record_failure(&mut self) {
        self.visits += 1;
        self.failures += 1;
    }

    /// 発見を記録
    pub fn record_discovery(&mut self, count: u32) {
        self.visits += 1;
        self.successes += 1;
        self.discoveries += count;
    }

    /// 成功率(訪問なしの場合は 0.5)
    pub fn success_rate(&self) -> f64 {
        if self.visits == 0 {
            0.5 // 事前確率
        } else {
            self.successes as f64 / self.visits as f64
        }
    }
}

// ============================================================================
// Tests
// ============================================================================

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn test_node_stats_success_rate() {
        let mut stats = NodeStats::new();
        assert_eq!(stats.success_rate(), 0.5); // 事前確率

        stats.record_success();
        stats.record_success();
        stats.record_failure();
        assert!((stats.success_rate() - 0.666).abs() < 0.01);
    }
}