pub struct Walker<'a> { /* private fields */ }
Expand description
A walker over a CommitStateSpace
.
A walker is given by a set of selected commits, along with a set of pinned nodes that belong to those selected commits. The selected commits determine which replacements in the state space are applied. Meanwhile, the pinned nodes within these commits determine which nodes are “frozen” in the exploration: no further commit can be selected that would invalidate any pinned node.
The set of selected commits of a walker defines a PersistentHugr
instance that can be retrieved by calling Walker::into_persistent_hugr
.
As the walker is expanded and more of the state space is explored, more
commits are selected, and the PersistentHugr
will change accordingly.
Pinned nodes (and pinned ports, i.e. ports at pinned nodes) are guaranteed
to be valid in all PersistentHugr
instances obtained as a result of
expansions of the current walker.
current walker.
Implementations§
Source§impl<'a> Walker<'a>
impl<'a> Walker<'a>
Sourcepub fn new(state_space: impl Into<Cow<'a, CommitStateSpace>>) -> Self
pub fn new(state_space: impl Into<Cow<'a, CommitStateSpace>>) -> Self
Sourcepub fn from_pinned_node(
node: PatchNode,
state_space: impl Into<Cow<'a, CommitStateSpace>>,
) -> Self
pub fn from_pinned_node( node: PatchNode, state_space: impl Into<Cow<'a, CommitStateSpace>>, ) -> Self
Create a new Walker
with a single pinned node.
Sourcepub fn try_pin_node(&mut self, node: PatchNode) -> Result<bool, PinNodeError>
pub fn try_pin_node(&mut self, node: PatchNode) -> Result<bool, PinNodeError>
Pin a node in the Walker
.
This method allows pinning a specific node in the Walker, which restricts the possible paths that can be explored in the Walker.
Return true if node
was not pinned already, and false otherwise.
If the node belongs to a commit that isn’t currently selected, the commit is added to the Walker, or an error is returned if this is not possible. The node is then added to the set of pinned nodes. If the node is already pinned, this method is a no-op.
Sourcepub fn get_wire(&self, node: PatchNode, port: impl Into<Port>) -> PinnedWire
pub fn get_wire(&self, node: PatchNode, port: impl Into<Port>) -> PinnedWire
Get the wire connected to a specified port of a pinned node.
§Panics
Panics if node
is not already pinned in this Walker.
Sourcepub fn into_persistent_hugr(self) -> PersistentHugr
pub fn into_persistent_hugr(self) -> PersistentHugr
Materialise the PersistentHugr
containing all the compatible commits
that have been selected during exploration.
Sourcepub fn as_hugr_view(&self) -> &PersistentHugr
pub fn as_hugr_view(&self) -> &PersistentHugr
View the PersistentHugr
containing all the compatible commits that
have been selected so far during exploration.
Of the space of all possible HUGRs that can be obtained from future expansions of the walker, this is the HUGR corresponding to selecting as few commits as possible (i.e. all the commits that have been selected so far and no more).
Sourcepub fn expand<'b>(
&'b self,
wire: &'b PinnedWire,
dir: impl Into<Option<Direction>>,
) -> impl Iterator<Item = Walker<'a>> + 'b
pub fn expand<'b>( &'b self, wire: &'b PinnedWire, dir: impl Into<Option<Direction>>, ) -> impl Iterator<Item = Walker<'a>> + 'b
Expand the Walker by pinning a node connected to the given wire.
To understand how Walkers are expanded, it is useful to understand how in a walker, the HUGR graph is partitioned into two parts:
- a subgraph made of pinned nodes: this part of the HUGR is frozen: it cannot be modified by further expansions the Walker.
- the complement subgraph: the unpinned part of the HUGR has not been explored yet. Multiple alternative HUGRs can be obtained depending on which commits are selected.
To every walker thus corresponds a space of possible HUGRs that can be obtained, depending on which commits are selected and which further nodes are pinned. The expansion of a walker returns a set of walkers, which together cover the same space of possible HUGRs, each having a different additional node pinned.
Return an iterator over all possible Walker
s that can be created by
pinning exactly one additional node connected to wire
. Each returned
Walker
represents a different alternative Hugr in the exploration
space.
Optionally, the expansion can be restricted to only ports with the given direction (incoming or outgoing).
Repeatedly calling expand
on a wire will progressively pin all its
endpoints. The multiple alternative Walker
s returned then form
a branching search space to be explored by the user. When a wire is
fully pinned in the specified direction, i.e. wire.is_complete(dir)
is
true, then an empty iterator is returned.
Trait Implementations§
Auto Trait Implementations§
impl<'a> Freeze for Walker<'a>
impl<'a> !RefUnwindSafe for Walker<'a>
impl<'a> !Send for Walker<'a>
impl<'a> !Sync for Walker<'a>
impl<'a> Unpin for Walker<'a>
impl<'a> !UnwindSafe for Walker<'a>
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> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
Source§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Box<dyn Trait>
(where Trait: Downcast
) to Box<dyn Any>
, which can then be
downcast
into Box<dyn ConcreteType>
where ConcreteType
implements Trait
.Source§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Rc<Trait>
(where Trait: Downcast
) to Rc<Any>
, which can then be further
downcast
into Rc<ConcreteType>
where ConcreteType
implements Trait
.Source§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
&Trait
(where Trait: Downcast
) to &Any
. This is needed since Rust cannot
generate &Any
’s vtable from &Trait
’s.Source§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut Trait
(where Trait: Downcast
) to &Any
. This is needed since Rust cannot
generate &mut Any
’s vtable from &mut Trait
’s.Source§impl<T> FmtForward for T
impl<T> FmtForward for T
Source§fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
self
to use its Binary
implementation when Debug
-formatted.Source§fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
self
to use its Display
implementation when
Debug
-formatted.Source§fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
self
to use its LowerExp
implementation when
Debug
-formatted.Source§fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
self
to use its LowerHex
implementation when
Debug
-formatted.Source§fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
self
to use its Octal
implementation when Debug
-formatted.Source§fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
self
to use its Pointer
implementation when
Debug
-formatted.Source§fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
self
to use its UpperExp
implementation when
Debug
-formatted.Source§fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
self
to use its UpperHex
implementation when
Debug
-formatted.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 moreSource§impl<T> Pipe for Twhere
T: ?Sized,
impl<T> Pipe for Twhere
T: ?Sized,
Source§fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
Source§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,
self
and passes that borrow into the pipe function. Read moreSource§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,
self
and passes that borrow into the pipe function. Read moreSource§fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
Source§fn pipe_borrow_mut<'a, B, R>(
&'a mut self,
func: impl FnOnce(&'a mut B) -> R,
) -> R
fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
Source§fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
self
, then passes self.as_ref()
into the pipe function.Source§fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
self
, then passes self.as_mut()
into the pipe
function.Source§fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
self
, then passes self.deref()
into the pipe function.Source§impl<T> Tap for T
impl<T> Tap for T
Source§fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
Borrow<B>
of a value. Read moreSource§fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
BorrowMut<B>
of a value. Read moreSource§fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
AsRef<R>
view of a value. Read moreSource§fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
AsMut<R>
view of a value. Read moreSource§fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
Deref::Target
of a value. Read moreSource§fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
Deref::Target
of a value. Read moreSource§fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
.tap()
only in debug builds, and is erased in release builds.Source§fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
.tap_mut()
only in debug builds, and is erased in release
builds.Source§fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
.tap_borrow()
only in debug builds, and is erased in release
builds.Source§fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
.tap_borrow_mut()
only in debug builds, and is erased in release
builds.Source§fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
.tap_ref()
only in debug builds, and is erased in release
builds.Source§fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
.tap_ref_mut()
only in debug builds, and is erased in release
builds.Source§fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
.tap_deref()
only in debug builds, and is erased in release
builds.