Skip to main content

swarm_engine_core/exploration/
mod.rs

1//! Exploration System - 探索アルゴリズム (V2)
2//!
3//! # 設計方針: Tree 探索モデル
4//!
5//! ExplorationSpace は **Tree 探索モデル** を採用している。
6//!
7//! ## Agent タスクの特性
8//!
9//! Agent のタスクは以下の2種類に大別される:
10//!
11//! - **Look 系**: 情報取得(WebSearch, Grep, ReadFile, Fetch...)
12//! - **Check 系**: 成功/失敗判定(Affection & Check)
13//!
14//! ```text
15//! Look(A) → Expand → Check(A', B'...)
16//!                   ├─ Success → Done
17//!                   └─ Fail → Look(C) → Expand → Check(C'...)
18//! ```
19//!
20//! ## なぜ Tree で十分か
21//!
22//! - Agent の Tool 呼び出しは **同じ (Action, Target, Args) を繰り返しても結果は変わらない**
23//! - Network/Flaky は Tool 内部でリトライ処理
24//! - だから **dedup_key による重複排除** が正しく機能する
25//! - **状態 = (Action, Target, Args)** で十分(Position 不要)
26//!
27//! ## 迷路問題との違い
28//!
29//! 迷路のような問題は Tree モデルには向かない:
30//!
31//! - 迷路: 同じ位置に「戻る」ことに意味がある(バックトラック)
32//! - Agent: 同じ状態に「戻る」ことに意味がない
33//!
34//! 迷路を解くには Position を状態に含める必要があるが、
35//! 実際の Agent タスク(DeepSearch, Coding, Security Audit 等)では不要。
36//!
37//! # モジュール構成
38//!
39//! - `space`: 探索空間 V2(統合レイヤー)
40//! - `map`: 探索マップの抽象層(`ExplorationMap` trait)
41//! - `mutation`: MutationInput/MapUpdate(入力→Map操作変換)
42//! - `node_rules`: 純粋な遷移制約(ドメイン非依存)
43//! - `exploration`: 共通型定義(ExplorationTarget, NodeId 等)
44//! - `dependency_planner`: アクション依存グラフの計画
45
46pub mod dependency_planner;
47pub mod exploration;
48pub mod llm_provider;
49pub mod map;
50pub mod mutation;
51pub mod node_rules;
52pub mod operator;
53pub mod provider;
54pub mod selection;
55pub mod space;
56
57pub use dependency_planner::{
58    DependencyEdge, DependencyGraph, DependencyGraphBuilder, DependencyGraphError,
59    DependencyGraphProvider, DependencyPlanner, DependencyPromptGenerator, GraphNavigator,
60    LearnedDependencyProvider, LlmDependencyResponse, LlmEdge, StaticDependencyPlanner,
61};
62// V2 で必要な共通型のみ re-export
63pub use exploration::{EdgeId, ExplorationTarget, NodeId, TrialPolicy};
64pub use llm_provider::{
65    AdaptiveLlmOperatorProvider, ReviewPolicy, StrategyAdvice, StrategyAdviceError,
66    StrategyAdvisor, StrategyContext,
67};
68pub use map::{
69    AddResult, ExplorationMap, GraphExplorationMap, GraphMap, GraphMapUpdate, HierarchicalMap,
70    MapApplyResult, MapEdge, MapEdgeId, MapError, MapNode, MapNodeId, MapNodeState, MapResult,
71};
72pub use mutation::{
73    ActionExtractor, ActionNodeData, ExplorationResult, MapUpdate, MapUpdateResult, MutationInput,
74};
75pub use node_rules::{NodeRules, Rules};
76pub use operator::{
77    // Operator core
78    ConfigurableOperator,
79    FifoOperator,
80    MutationLogic,
81    Operator,
82    RulesBasedMutation,
83    Ucb1Operator,
84};
85pub use provider::{
86    // Provider
87    AdaptiveOperatorProvider,
88    ConfigBasedOperatorProvider,
89    OperatorConfig,
90    OperatorProvider,
91    ProviderContext,
92};
93pub use selection::{
94    // Dynamic wrapper
95    AnySelection,
96    // Selection implementations
97    Fifo,
98    FifoSelection,
99    Greedy,
100    GreedySelection,
101    // SelectionKind enum
102    SelectionKind,
103    // SelectionLogic trait
104    SelectionLogic,
105    Thompson,
106    ThompsonSelection,
107    Ucb1,
108    Ucb1Selection,
109};
110pub use space::{ConfigurableSpace, ExplorationSpaceV2};
111
112// ============================================================================
113// ID Conversions (V1 ↔ V2)
114// ============================================================================
115
116impl From<MapNodeId> for NodeId {
117    fn from(id: MapNodeId) -> Self {
118        NodeId(id.0)
119    }
120}
121
122impl From<NodeId> for MapNodeId {
123    fn from(id: NodeId) -> Self {
124        MapNodeId(id.0)
125    }
126}