Struct stack_graphs::stitching::ForwardPartialPathStitcher
source · [−]pub struct ForwardPartialPathStitcher { /* private fields */ }
Expand description
Implements a phased forward partial path stitching algorithm.
Our overall goal is to start with a set of seed partial paths, and to repeatedly extend each partial path by concatenating another, compatible partial path onto the end of it. (If there are multiple compatible partial paths, we concatenate each of them separately, resulting in more than one extension for the current path.)
We perform this processing in phases. At the start of each phase, we have a current set of
partial paths that need to be processed. As we extend those partial paths, we add the
extensions to the set of partial paths to process in the next phase. Phases are processed
one at a time, each time you invoke the process_next_phase
method.
After each phase has completed, you can use the previous_phase_partial_paths
method to
retrieve all of the partial paths that were discovered during that phase. That gives you a
chance to add to the Database
all of the other partial paths that we might need to extend
those partial paths with before invoking the next phase.
If you don’t care about this phasing nonsense, you can instead preload your Database
with all
possible partial paths, and run the forward partial path stitching algorithm all the way to
completion, using the find_all_complete_partial_paths
method.
Implementations
sourceimpl ForwardPartialPathStitcher
impl ForwardPartialPathStitcher
sourcepub fn from_nodes<I>(
graph: &StackGraph,
partials: &mut PartialPaths,
db: &mut Database,
starting_nodes: I
) -> ForwardPartialPathStitcherwhere
I: IntoIterator<Item = Handle<Node>>,
pub fn from_nodes<I>(
graph: &StackGraph,
partials: &mut PartialPaths,
db: &mut Database,
starting_nodes: I
) -> ForwardPartialPathStitcherwhere
I: IntoIterator<Item = Handle<Node>>,
Creates a new forward partial path stitcher that is “seeded” with a set of starting stack graph nodes.
Before calling this method, you must ensure that db
contains all of the possible partial
paths that start with any of your requested starting nodes.
Before calling [process_next_phase
][] for the first time, you must ensure that db
contains all possible extensions of any of those initial partial paths. You can retrieve a
list of those extensions via [previous_phase_partial paths
][].
[previous_phase_partial paths
]: #method.previous_phase_partial paths
[process_next_phase
]: #method.process_next_phase
sourcepub fn from_partial_paths(
initial_partial_paths: Vec<PartialPath>
) -> ForwardPartialPathStitcher
pub fn from_partial_paths(
initial_partial_paths: Vec<PartialPath>
) -> ForwardPartialPathStitcher
Creates a new forward partial path stitcher that is “seeded” with a set of initial partial paths.
Before calling [process_next_phase
][] for the first time, you must ensure that db
contains all possible extensions of any of those initial partial paths. You can retrieve a
list of those extensions via [previous_phase_partial paths
][].
[previous_phase_partial paths
]: #method.previous_phase_partial paths
[process_next_phase
]: #method.process_next_phase
sourcepub fn previous_phase_partial_paths(
&self
) -> impl Iterator<Item = &PartialPath> + '_
pub fn previous_phase_partial_paths(
&self
) -> impl Iterator<Item = &PartialPath> + '_
Returns an iterator of all of the (possibly incomplete) partial paths that were encountered during the most recent phase of the algorithm.
sourcepub fn previous_phase_partial_paths_slice(&mut self) -> &[PartialPath]
pub fn previous_phase_partial_paths_slice(&mut self) -> &[PartialPath]
Returns a slice of all of the (possibly incomplete) partial paths that were encountered during the most recent phase of the algorithm.
sourcepub fn previous_phase_partial_paths_slice_mut(&mut self) -> &mut [PartialPath]
pub fn previous_phase_partial_paths_slice_mut(&mut self) -> &mut [PartialPath]
Returns a mutable slice of all of the (possibly incomplete) partial paths that were encountered during the most recent phase of the algorithm.
sourcepub fn set_max_work_per_phase(&mut self, max_work_per_phase: usize)
pub fn set_max_work_per_phase(&mut self, max_work_per_phase: usize)
Sets the maximum amount of work that can be performed during each phase of the algorithm. By bounding our work this way, you can ensure that it’s not possible for our CPU-bound algorithm to starve any worker threads or processes that you might be using. If you don’t call this method, then we allow ourselves to process all of the extensions of all of the paths found in the previous phase, with no additional bound.
sourcepub fn is_complete(&self) -> bool
pub fn is_complete(&self) -> bool
Returns whether the algorithm has completed.
sourcepub fn process_next_phase(
&mut self,
graph: &StackGraph,
partials: &mut PartialPaths,
db: &mut Database
)
pub fn process_next_phase(
&mut self,
graph: &StackGraph,
partials: &mut PartialPaths,
db: &mut Database
)
Runs the next phase of the algorithm. We will have built up a set of incomplete partial
paths during the previous phase. Before calling this function, you must ensure that db
contains all of the possible other partial paths that we might want to extend any of those
candidate partial paths with.
After this method returns, you can use previous_phase_partial_paths
to retrieve a
list of the (possibly incomplete) partial paths that were encountered during this phase.
sourcepub fn find_all_complete_partial_paths<I>(
graph: &StackGraph,
partials: &mut PartialPaths,
db: &mut Database,
starting_nodes: I,
cancellation_flag: &dyn CancellationFlag
) -> Result<Vec<PartialPath>, CancellationError>where
I: IntoIterator<Item = Handle<Node>>,
pub fn find_all_complete_partial_paths<I>(
graph: &StackGraph,
partials: &mut PartialPaths,
db: &mut Database,
starting_nodes: I,
cancellation_flag: &dyn CancellationFlag
) -> Result<Vec<PartialPath>, CancellationError>where
I: IntoIterator<Item = Handle<Node>>,
Returns all of the complete partial paths that are reachable from a set of starting nodes, building them up by stitching together partial paths from this database.
This function will not return until all reachable partial paths have been processed, so
your database must already contain all partial paths that might be needed. If you have a
very large stack graph stored in some other storage system, and want more control over
lazily loading only the necessary pieces, then you should code up your own loop that calls
process_next_phase
manually.
Auto Trait Implementations
impl !RefUnwindSafe for ForwardPartialPathStitcher
impl Send for ForwardPartialPathStitcher
impl Sync for ForwardPartialPathStitcher
impl Unpin for ForwardPartialPathStitcher
impl !UnwindSafe for ForwardPartialPathStitcher
Blanket Implementations
sourceimpl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
const: unstable · sourcefn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more
impl<T> FmtForward for T
impl<T> FmtForward for T
fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
Causes self
to use its Binary
implementation when Debug
-formatted.
fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
Causes self
to use its Display
implementation when
Debug
-formatted. Read more
fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
Causes self
to use its LowerExp
implementation when
Debug
-formatted. Read more
fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
Causes self
to use its LowerHex
implementation when
Debug
-formatted. Read more
fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
Causes self
to use its Octal
implementation when Debug
-formatted.
fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
Causes self
to use its Pointer
implementation when
Debug
-formatted. Read more
fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
Causes self
to use its UpperExp
implementation when
Debug
-formatted. Read more
fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
Causes self
to use its UpperHex
implementation when
Debug
-formatted. Read more
impl<T> Pipe for Twhere
T: ?Sized,
impl<T> Pipe for Twhere
T: ?Sized,
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> R
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> R
Pipes by value. This is generally the method you want to use. Read more
fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
Borrows self
and passes that borrow into the pipe function. Read more
fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
Mutably borrows self
and passes that borrow into the pipe function. Read more
fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> Rwhere
Self: Borrow<B>,
B: 'a + ?Sized,
R: 'a,
fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> Rwhere
Self: Borrow<B>,
B: 'a + ?Sized,
R: 'a,
Borrows self
, then passes self.borrow()
into the pipe function. Read more
fn pipe_borrow_mut<'a, B, R>(
&'a mut self,
func: impl FnOnce(&'a mut B) -> R
) -> Rwhere
Self: BorrowMut<B>,
B: 'a + ?Sized,
R: 'a,
fn pipe_borrow_mut<'a, B, R>(
&'a mut self,
func: impl FnOnce(&'a mut B) -> R
) -> Rwhere
Self: BorrowMut<B>,
B: 'a + ?Sized,
R: 'a,
Mutably borrows self
, then passes self.borrow_mut()
into the pipe
function. Read more
fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> Rwhere
Self: AsRef<U>,
U: 'a + ?Sized,
R: 'a,
fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> Rwhere
Self: AsRef<U>,
U: 'a + ?Sized,
R: 'a,
Borrows self
, then passes self.as_ref()
into the pipe function.
fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> Rwhere
Self: AsMut<U>,
U: 'a + ?Sized,
R: 'a,
fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> Rwhere
Self: AsMut<U>,
U: 'a + ?Sized,
R: 'a,
Mutably borrows self
, then passes self.as_mut()
into the pipe
function. Read more
fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> Rwhere
Self: Deref<Target = T>,
T: 'a + ?Sized,
R: 'a,
fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> Rwhere
Self: Deref<Target = T>,
T: 'a + ?Sized,
R: 'a,
Borrows self
, then passes self.deref()
into the pipe function.
impl<T> Tap for T
impl<T> Tap for T
fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Selfwhere
Self: Borrow<B>,
B: ?Sized,
fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Selfwhere
Self: Borrow<B>,
B: ?Sized,
Immutable access to the Borrow<B>
of a value. Read more
fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Selfwhere
Self: BorrowMut<B>,
B: ?Sized,
fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Selfwhere
Self: BorrowMut<B>,
B: ?Sized,
Mutable access to the BorrowMut<B>
of a value. Read more
fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Selfwhere
Self: AsRef<R>,
R: ?Sized,
fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Selfwhere
Self: AsRef<R>,
R: ?Sized,
Immutable access to the AsRef<R>
view of a value. Read more
fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Selfwhere
Self: AsMut<R>,
R: ?Sized,
fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Selfwhere
Self: AsMut<R>,
R: ?Sized,
Mutable access to the AsMut<R>
view of a value. Read more
fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Selfwhere
Self: Deref<Target = T>,
T: ?Sized,
fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Selfwhere
Self: Deref<Target = T>,
T: ?Sized,
Immutable access to the Deref::Target
of a value. Read more
fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Selfwhere
Self: DerefMut<Target = T> + Deref,
T: ?Sized,
fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Selfwhere
Self: DerefMut<Target = T> + Deref,
T: ?Sized,
Mutable access to the Deref::Target
of a value. Read more
fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
Calls .tap()
only in debug builds, and is erased in release builds.
fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
Calls .tap_mut()
only in debug builds, and is erased in release
builds. Read more
fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Selfwhere
Self: Borrow<B>,
B: ?Sized,
fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Selfwhere
Self: Borrow<B>,
B: ?Sized,
Calls .tap_borrow()
only in debug builds, and is erased in release
builds. Read more
fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Selfwhere
Self: BorrowMut<B>,
B: ?Sized,
fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Selfwhere
Self: BorrowMut<B>,
B: ?Sized,
Calls .tap_borrow_mut()
only in debug builds, and is erased in release
builds. Read more
fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Selfwhere
Self: AsRef<R>,
R: ?Sized,
fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Selfwhere
Self: AsRef<R>,
R: ?Sized,
Calls .tap_ref()
only in debug builds, and is erased in release
builds. Read more
fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Selfwhere
Self: AsMut<R>,
R: ?Sized,
fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Selfwhere
Self: AsMut<R>,
R: ?Sized,
Calls .tap_ref_mut()
only in debug builds, and is erased in release
builds. Read more