pub struct GraphMap<N, E, S: MapState> { /* private fields */ }Expand description
グラフベースの探索マップ
ノードとエッジでグラフ構造を表現する。
ExplorationMap と GraphExplorationMap を実装。
§型パラメータ
N: ノードデータの型(課題 / Action / 状態 など)E: エッジデータの型(アクション / 遷移情報 など)S: 状態の型(MapState を実装)
§使用例
// 文字列をノードデータとするマップ
let mut map: GraphMap<String, String, MapNodeState> = GraphMap::new();
// ルートノードを作成
let root = map.create_root("start".to_string(), MapNodeState::Open);
// 子ノードを追加
let update = GraphMapUpdate::AddChild {
parent: root,
edge_data: "action-1".to_string(),
node_data: "state-1".to_string(),
node_state: MapNodeState::Open,
dedup_key: "state-1".to_string(),
};
let result = map.apply(update);Implementations§
Source§impl<N, E, S: MapState> GraphMap<N, E, S>
impl<N, E, S: MapState> GraphMap<N, E, S>
Sourcepub fn index_node<K, F>(&mut self, node_id: MapNodeId, key_fn: F)
pub fn index_node<K, F>(&mut self, node_id: MapNodeId, key_fn: F)
ノードをインデックスに登録
キー抽出関数でキーを取得し、ハッシュ値でインデックスに登録する。
Sourcepub fn contains_key<K: Hash>(&self, key: &K) -> bool
pub fn contains_key<K: Hash>(&self, key: &K) -> bool
キーが存在するか確認
Sourcepub fn clear_index(&mut self)
pub fn clear_index(&mut self)
インデックスをクリア
Sourcepub fn rebuild_index<K, F>(&mut self, key_fn: F)
pub fn rebuild_index<K, F>(&mut self, key_fn: F)
インデックスを再構築
全ノードに対してキー抽出関数を適用し、インデックスを再構築する。
Sourcepub fn find_node<F>(&self, predicate: F) -> Option<MapNodeId>
pub fn find_node<F>(&self, predicate: F) -> Option<MapNodeId>
条件に一致する最初のノードを検索
O(n) の線形検索。頻繁に呼ぶ場合はインデックスを使う。
Sourcepub fn find_nodes<F>(&self, predicate: F) -> Vec<MapNodeId>
pub fn find_nodes<F>(&self, predicate: F) -> Vec<MapNodeId>
条件に一致する全ノードを検索
Sourcepub fn find_by_data(&self, data: &N) -> Option<MapNodeId>where
N: PartialEq,
pub fn find_by_data(&self, data: &N) -> Option<MapNodeId>where
N: PartialEq,
データで検索(N: PartialEq の場合)
Sourcepub fn find_by_state(&self, state: &S) -> Vec<MapNodeId>where
S: PartialEq,
pub fn find_by_state(&self, state: &S) -> Vec<MapNodeId>where
S: PartialEq,
状態で検索(S: PartialEq の場合)
指定した状態のノードを全て返す。 利用者が「Completed 状態のノード」「Failed 状態のノード」等を 取得するのに使う。
Sourcepub fn find_nodes_by_state<F>(&self, predicate: F) -> Vec<MapNodeId>
pub fn find_nodes_by_state<F>(&self, predicate: F) -> Vec<MapNodeId>
状態の条件で検索
状態に対する任意の条件でノードを検索する。
Sourcepub fn create_root_if_absent<K, F>(
&mut self,
data: N,
state: S,
key_fn: F,
) -> AddResult<MapNodeId>
pub fn create_root_if_absent<K, F>( &mut self, data: N, state: S, key_fn: F, ) -> AddResult<MapNodeId>
重複チェック付きルートノード作成
キーが既に存在する場合は既存ノードを返す。
Sourcepub fn add_child_if_absent<K, F>(
&mut self,
parent: MapNodeId,
edge_data: E,
node_data: N,
node_state: S,
key_fn: F,
) -> MapResult<AddResult<MapNodeId>>
pub fn add_child_if_absent<K, F>( &mut self, parent: MapNodeId, edge_data: E, node_data: N, node_state: S, key_fn: F, ) -> MapResult<AddResult<MapNodeId>>
重複チェック付きノード追加(親ノード指定)
キーが既に存在する場合は既存ノードを返す。 親ノードが見つからない場合はエラー。
Sourcepub fn create_root(&mut self, data: N, state: S) -> MapNodeId
pub fn create_root(&mut self, data: N, state: S) -> MapNodeId
ルートノードを作成
Sourcepub fn set_state(&mut self, id: MapNodeId, state: S)
pub fn set_state(&mut self, id: MapNodeId, state: S)
ノードの状態を更新
状態変更時に expandables インデックスを自動更新する。
Sourcepub fn add_nodes(&mut self, nodes: Vec<(N, S)>) -> Vec<MapNodeId>
pub fn add_nodes(&mut self, nodes: Vec<(N, S)>) -> Vec<MapNodeId>
複数ノードを一括追加
各 (data, state) ペアからノードを作成。 最初のノードがルートになり、以降は独立したノードとして追加。
Sourcepub fn set_states(&mut self, ids: &[MapNodeId], state: S) -> Vec<MapNodeId>
pub fn set_states(&mut self, ids: &[MapNodeId], state: S) -> Vec<MapNodeId>
複数ノードの状態を一括変更
Sourcepub fn close_nodes(&mut self, ids: &[MapNodeId]) -> Vec<MapNodeId>
pub fn close_nodes(&mut self, ids: &[MapNodeId]) -> Vec<MapNodeId>
複数ノードを一括 Close(S::closed() を使用)
存在しないノード ID はスキップされる。 戻り値は実際に Close されたノード ID のリスト。
Sourcepub fn cascade_down(&mut self, id: MapNodeId) -> Vec<MapNodeId>
pub fn cascade_down(&mut self, id: MapNodeId) -> Vec<MapNodeId>
下方向カスケード: 自身と全子孫を Close
戻り値は Close されたノード ID のリスト(指定ノード含む)。
Sourcepub fn cascade_up_if_all_closed(&mut self, id: MapNodeId) -> Vec<MapNodeId>
pub fn cascade_up_if_all_closed(&mut self, id: MapNodeId) -> Vec<MapNodeId>
上方向カスケード: 全子が is_closed() なら親を Close(再帰)
戻り値は Close されたノード ID のリスト。
Sourcepub fn close_with_cascade_up(&mut self, id: MapNodeId) -> Vec<MapNodeId>
pub fn close_with_cascade_up(&mut self, id: MapNodeId) -> Vec<MapNodeId>
状態変更 + 上方向カスケード
ノードを Close した後、親が Close 可能ならカスケード。 戻り値は Close されたノード ID のリスト(自身含む)。
Sourcepub fn get_nodes(&self, ids: &[MapNodeId]) -> Vec<&MapNode<N, S>>
pub fn get_nodes(&self, ids: &[MapNodeId]) -> Vec<&MapNode<N, S>>
複数ノードを一括取得
存在しない ID はスキップされる。 順序は入力の順序を保持。
Sourcepub fn get_node_data(&self, ids: &[MapNodeId]) -> Vec<&N>
pub fn get_node_data(&self, ids: &[MapNodeId]) -> Vec<&N>
複数ノードのデータを一括取得
存在しない ID はスキップされる。 ノード全体ではなくデータ部分のみが必要な場合に使用。
Sourcepub fn expandables(&self) -> impl Iterator<Item = MapNodeId> + '_
pub fn expandables(&self) -> impl Iterator<Item = MapNodeId> + '_
展開可能なノード一覧(= expandables)
Sourcepub fn expandables_count(&self) -> usize
pub fn expandables_count(&self) -> usize
展開可能なノード数
Sourcepub fn closed_nodes(&self) -> Vec<MapNodeId>
pub fn closed_nodes(&self) -> Vec<MapNodeId>
Closed なノード一覧
Sourcepub fn working_nodes(&self) -> Vec<MapNodeId>
pub fn working_nodes(&self) -> Vec<MapNodeId>
作業中のノード一覧(!is_expandable && !is_closed)
フロンティアでも終了でもない中間状態のノード。 例: Processing, Pending など。
Source§impl<N, E, S> GraphMap<N, E, S>
impl<N, E, S> GraphMap<N, E, S>
Sourcepub fn apply_update<K, F>(
&mut self,
update: MapUpdate<N, E, S>,
key_fn: F,
) -> MapUpdateResult
pub fn apply_update<K, F>( &mut self, update: MapUpdate<N, E, S>, key_fn: F, ) -> MapUpdateResult
MapUpdate を適用
Sourcepub fn apply_updates<K, F>(
&mut self,
updates: Vec<MapUpdate<N, E, S>>,
key_fn: F,
) -> Vec<MapUpdateResult>
pub fn apply_updates<K, F>( &mut self, updates: Vec<MapUpdate<N, E, S>>, key_fn: F, ) -> Vec<MapUpdateResult>
複数の MapUpdate を適用
Trait Implementations§
Source§impl<N, E, S> ExplorationMap for GraphMap<N, E, S>
impl<N, E, S> ExplorationMap for GraphMap<N, E, S>
Source§type Update = GraphMapUpdate<N, E, S>
type Update = GraphMapUpdate<N, E, S>
Source§type Result = MapApplyResult<N>
type Result = MapApplyResult<N>
Source§fn node_count(&self) -> usize
fn node_count(&self) -> usize
Source§impl<N, E, S> GraphExplorationMap for GraphMap<N, E, S>
impl<N, E, S> GraphExplorationMap for GraphMap<N, E, S>
Source§fn edge_count(&self) -> usize
fn edge_count(&self) -> usize
Source§impl<N, E, S> HierarchicalMap for GraphMap<N, E, S>
impl<N, E, S> HierarchicalMap for GraphMap<N, E, S>
Auto Trait Implementations§
impl<N, E, S> Freeze for GraphMap<N, E, S>
impl<N, E, S> RefUnwindSafe for GraphMap<N, E, S>
impl<N, E, S> Send for GraphMap<N, E, S>
impl<N, E, S> Sync for GraphMap<N, E, S>
impl<N, E, S> Unpin for GraphMap<N, E, S>
impl<N, E, S> UnwindSafe for GraphMap<N, E, S>
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more