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//! - `types`: 共通型定義(ExplorationTarget, NodeId 等)
44//! - `dependency_planner`: アクション依存グラフの計画
45
46pub mod dependency_planner;
47pub mod llm_provider;
48pub mod map;
49pub mod mutation;
50pub mod node_rules;
51pub mod operator;
52pub mod provider;
53pub mod selection;
54pub mod space;
55pub mod types;
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 llm_provider::{
64    AdaptiveLlmOperatorProvider, ReviewPolicy, StrategyAdvice, StrategyAdviceError,
65    StrategyAdvisor, StrategyContext,
66};
67pub use map::{
68    AddResult, ExplorationMap, GraphExplorationMap, GraphMap, GraphMapUpdate, HierarchicalMap,
69    MapApplyResult, MapEdge, MapEdgeId, MapError, MapNode, MapNodeId, MapNodeState, MapResult,
70};
71pub use mutation::{
72    ActionExtractor, ActionNodeData, ExplorationResult, MapUpdate, MapUpdateResult, MutationInput,
73};
74pub use node_rules::{NodeRules, Rules};
75pub use operator::{
76    // Operator core
77    ConfigurableOperator,
78    FifoOperator,
79    MutationLogic,
80    Operator,
81    RulesBasedMutation,
82    Ucb1Operator,
83};
84pub use provider::{
85    // Provider
86    AdaptiveOperatorProvider,
87    ConfigBasedOperatorProvider,
88    OperatorConfig,
89    OperatorProvider,
90    ProviderContext,
91};
92pub use selection::{
93    // Dynamic wrapper
94    AnySelection,
95    // Selection implementations
96    Fifo,
97    FifoSelection,
98    Greedy,
99    GreedySelection,
100    // SelectionKind enum
101    SelectionKind,
102    // SelectionLogic trait
103    SelectionLogic,
104    Thompson,
105    ThompsonSelection,
106    Ucb1,
107    Ucb1Selection,
108};
109pub use space::{ConfigurableSpace, ExplorationSpaceV2};
110pub use types::{EdgeId, ExplorationTarget, NodeId, TrialPolicy};
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}