pub struct SiblingSubgraph { /* private fields */ }Expand description
A non-empty convex subgraph of a HUGR sibling graph.
A HUGR region in which all nodes share the same parent. Unlike
super::SiblingGraph, not all nodes of the sibling graph must be
included. A convex subgraph is always an induced subgraph, i.e. it is defined
by a set of nodes and all edges between them.
The incoming boundary (resp. outgoing boundary) is given by the input (resp.
output) ports of the subgraph that are linked to nodes outside of the subgraph.
The signature of the subgraph is then given by the types of the incoming
and outgoing boundary ports. Given a replacement with the same signature,
a SimpleReplacement can be constructed to rewrite the subgraph with the
replacement.
The ordering of the nodes in the subgraph is irrelevant to define the convex subgraph, but it determines the ordering of the boundary signature.
No reference to the underlying graph is kept. Thus most of the subgraph methods expect a reference to the Hugr as an argument.
At the moment we do not support state order edges at the subgraph boundary.
The boundary_port and signature methods will panic if any are found.
State order edges are also unsupported in replacements in
create_simple_replacement.
Implementations§
source§impl SiblingSubgraph
impl SiblingSubgraph
sourcepub fn try_new_dataflow_subgraph<H, Root>(
dfg_graph: &H,
) -> Result<Self, InvalidSubgraph>where
H: Clone + RootTagged<RootHandle = Root>,
Root: ContainerHandle<ChildrenHandle = DataflowOpID>,
pub fn try_new_dataflow_subgraph<H, Root>(
dfg_graph: &H,
) -> Result<Self, InvalidSubgraph>where
H: Clone + RootTagged<RootHandle = Root>,
Root: ContainerHandle<ChildrenHandle = DataflowOpID>,
A sibling subgraph from a crate::ops::OpTag::DataflowParent-rooted
HUGR.
The subgraph is given by the nodes between the input and output children
nodes of the root node. If you wish to create a subgraph from another
root, wrap the region argument in a super::SiblingGraph.
Wires connecting the input and output nodes are ignored. Note that due to this the resulting subgraph’s signature may not match the signature of the dataflow parent.
This will return an InvalidSubgraph::EmptySubgraph error if the
subgraph is empty.
sourcepub fn try_new(
incoming: IncomingPorts,
outgoing: OutgoingPorts,
hugr: &impl HugrView,
) -> Result<Self, InvalidSubgraph>
pub fn try_new( incoming: IncomingPorts, outgoing: OutgoingPorts, hugr: &impl HugrView, ) -> Result<Self, InvalidSubgraph>
Create a new convex sibling subgraph from input and output boundaries.
Any sibling subgraph can be defined using two sets of boundary edges $B_I$ and $B_O$, the incoming and outgoing boundary edges respectively. Intuitively, the sibling subgraph is all the edges and nodes “between” an edge of $B_I$ and an edge of $B_O$.
§Definition
More formally, the sibling subgraph of a graph $G = (V, E)$ given by sets of incoming and outgoing boundary edges $B_I, B_O \subseteq E$ is the graph given by the connected components of the graph $G’ = (V, E \ B_I \ B_O)$ that contain at least one node that is either
- the target of an incoming boundary edge, or
- the source of an outgoing boundary edge.
A subgraph is well-formed if for every edge in the HUGR
- it is in $B_I$ if and only if it has a source outside of the subgraph and a target inside of it, and
- it is in $B_O$ if and only if it has a source inside of the subgraph and a target outside of it.
§Arguments
The incoming and outgoing arguments give $B_I$ and $B_O$ respectively.
Incoming edges must be given by incoming ports and outgoing edges by
outgoing ports. The ordering of the incoming and outgoing ports defines
the signature of the subgraph.
Incoming boundary ports must be unique and partitioned by input parameter: two ports within the same set of the partition must be copyable and will result in the input being copied. Outgoing boundary ports are given in a list and can appear multiple times if they are copyable, in which case the output will be copied.
§Errors
This function fails if the subgraph is not convex, if the nodes do not share a common parent or if the subgraph is empty.
sourcepub fn try_new_with_checker(
inputs: IncomingPorts,
outputs: OutgoingPorts,
hugr: &impl HugrView,
checker: &impl ConvexChecker,
) -> Result<Self, InvalidSubgraph>
pub fn try_new_with_checker( inputs: IncomingPorts, outputs: OutgoingPorts, hugr: &impl HugrView, checker: &impl ConvexChecker, ) -> Result<Self, InvalidSubgraph>
Create a new convex sibling subgraph from input and output boundaries.
Provide a ConvexChecker instance to avoid constructing one for
faster convexity check. If you do not have one, use
SiblingSubgraph::try_new.
Refer to SiblingSubgraph::try_new for the full
documentation.
sourcepub fn try_from_nodes(
nodes: impl Into<Vec<Node>>,
hugr: &impl HugrView,
) -> Result<Self, InvalidSubgraph>
pub fn try_from_nodes( nodes: impl Into<Vec<Node>>, hugr: &impl HugrView, ) -> Result<Self, InvalidSubgraph>
Create a subgraph from a set of nodes.
The incoming boundary is given by the set of edges with a source not in nodes and a target in nodes. Conversely, the outgoing boundary is given by the set of edges with a source in nodes and a target not in nodes.
The subgraph signature will be given by the types of the incoming and
outgoing edges ordered by the node order in nodes and within each node
by the port order.
The in- and out-arity of the signature will match the
number of incoming and outgoing edges respectively. In particular, the
assumption is made that no two incoming edges have the same source
(no copy nodes at the input boundary).
sourcepub fn try_from_nodes_with_checker<'c, 'h: 'c, H: HugrView>(
nodes: impl Into<Vec<Node>>,
hugr: &'h H,
checker: &impl ConvexChecker,
) -> Result<Self, InvalidSubgraph>
pub fn try_from_nodes_with_checker<'c, 'h: 'c, H: HugrView>( nodes: impl Into<Vec<Node>>, hugr: &'h H, checker: &impl ConvexChecker, ) -> Result<Self, InvalidSubgraph>
Create a subgraph from a set of nodes.
Provide a ConvexChecker instance to avoid constructing one for
faster convexity check. If you do not have one, use
SiblingSubgraph::try_from_nodes.
Refer to SiblingSubgraph::try_from_nodes for the full
documentation.
sourcepub fn node_count(&self) -> usize
pub fn node_count(&self) -> usize
The number of nodes in the subgraph.
sourcepub fn incoming_ports(&self) -> &IncomingPorts
pub fn incoming_ports(&self) -> &IncomingPorts
Returns the computed IncomingPorts of the subgraph.
sourcepub fn outgoing_ports(&self) -> &OutgoingPorts
pub fn outgoing_ports(&self) -> &OutgoingPorts
Returns the computed OutgoingPorts of the subgraph.
sourcepub fn get_parent(&self, hugr: &impl HugrView) -> Node
pub fn get_parent(&self, hugr: &impl HugrView) -> Node
The parent of the sibling subgraph.
sourcepub fn create_simple_replacement(
&self,
hugr: &impl HugrView,
replacement: Hugr,
) -> Result<SimpleReplacement, InvalidReplacement>
pub fn create_simple_replacement( &self, hugr: &impl HugrView, replacement: Hugr, ) -> Result<SimpleReplacement, InvalidReplacement>
Construct a SimpleReplacement to replace self with replacement.
replacement must be a hugr with DFG root and its signature must
match the signature of the subgraph.
May return one of the following five errors
InvalidReplacement::InvalidDataflowGraph: the replacement graph is not acrate::ops::OpTag::DataflowParent-rooted graph,InvalidReplacement::InvalidSignature: the signature of the replacement DFG does not match the subgraph signature, orInvalidReplacement::NonConvexSubgraph: the sibling subgraph is not convex.
At the moment we do not support state order edges. If any are found in the replacement graph, this will panic.
Trait Implementations§
source§impl Clone for SiblingSubgraph
impl Clone for SiblingSubgraph
source§fn clone(&self) -> SiblingSubgraph
fn clone(&self) -> SiblingSubgraph
1.0.0 · source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreAuto Trait Implementations§
impl Freeze for SiblingSubgraph
impl RefUnwindSafe for SiblingSubgraph
impl Send for SiblingSubgraph
impl Sync for SiblingSubgraph
impl Unpin for SiblingSubgraph
impl UnwindSafe for SiblingSubgraph
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§unsafe fn clone_to_uninit(&self, dst: *mut T)
unsafe fn clone_to_uninit(&self, dst: *mut T)
clone_to_uninit)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>. Box<dyn Any> can
then be further downcast into Box<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>. Rc<Any> 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> DowncastSync for T
impl<T> DowncastSync for T
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.