pub struct SiblingSubgraph<N = Node> { /* 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. 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<N: HugrNode> SiblingSubgraph<N>
impl<N: HugrNode> SiblingSubgraph<N>
Sourcepub fn try_new_dataflow_subgraph<'h, H, Root>(
dfg_graph: impl RootCheckable<&'h H, Root>,
) -> Result<Self, InvalidSubgraph<N>>
pub fn try_new_dataflow_subgraph<'h, H, Root>( dfg_graph: impl RootCheckable<&'h H, Root>, ) -> Result<Self, InvalidSubgraph<N>>
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. 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<N>,
outgoing: OutgoingPorts<N>,
hugr: &impl HugrView<Node = N>,
) -> Result<Self, InvalidSubgraph<N>>
pub fn try_new( incoming: IncomingPorts<N>, outgoing: OutgoingPorts<N>, hugr: &impl HugrView<Node = N>, ) -> Result<Self, InvalidSubgraph<N>>
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<H: HugrView<Node = N>>(
inputs: IncomingPorts<N>,
outputs: OutgoingPorts<N>,
hugr: &H,
checker: &TopoConvexChecker<'_, H>,
) -> Result<Self, InvalidSubgraph<N>>
pub fn try_new_with_checker<H: HugrView<Node = N>>( inputs: IncomingPorts<N>, outputs: OutgoingPorts<N>, hugr: &H, checker: &TopoConvexChecker<'_, H>, ) -> Result<Self, InvalidSubgraph<N>>
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<N>>,
hugr: &impl HugrView<Node = N>,
) -> Result<Self, InvalidSubgraph<N>>
pub fn try_from_nodes( nodes: impl Into<Vec<N>>, hugr: &impl HugrView<Node = N>, ) -> Result<Self, InvalidSubgraph<N>>
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<H: HugrView<Node = N>>(
nodes: impl Into<Vec<N>>,
hugr: &H,
checker: &TopoConvexChecker<'_, H>,
) -> Result<Self, InvalidSubgraph<N>>
pub fn try_from_nodes_with_checker<H: HugrView<Node = N>>( nodes: impl Into<Vec<N>>, hugr: &H, checker: &TopoConvexChecker<'_, H>, ) -> Result<Self, InvalidSubgraph<N>>
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 from_node(node: N, hugr: &impl HugrView<Node = N>) -> Self
pub fn from_node(node: N, hugr: &impl HugrView<Node = N>) -> Self
Create a subgraph containing a single node.
The subgraph signature will be given by signature of the node.
§Panics
If the node has incoming or outgoing state order edges.
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<N>
pub fn incoming_ports(&self) -> &IncomingPorts<N>
Returns the computed IncomingPorts of the subgraph.
Sourcepub fn outgoing_ports(&self) -> &OutgoingPorts<N>
pub fn outgoing_ports(&self) -> &OutgoingPorts<N>
Returns the computed OutgoingPorts of the subgraph.
Sourcepub fn signature(&self, hugr: &impl HugrView<Node = N>) -> Signature
pub fn signature(&self, hugr: &impl HugrView<Node = N>) -> Signature
The signature of the subgraph.
Sourcepub fn get_parent(&self, hugr: &impl HugrView<Node = N>) -> N
pub fn get_parent(&self, hugr: &impl HugrView<Node = N>) -> N
The parent of the sibling subgraph.
Sourcepub fn create_simple_replacement(
&self,
hugr: &impl HugrView<Node = N>,
replacement: Hugr,
) -> Result<SimpleReplacement<N>, InvalidReplacement>
pub fn create_simple_replacement( &self, hugr: &impl HugrView<Node = N>, replacement: Hugr, ) -> Result<SimpleReplacement<N>, InvalidReplacement>
Construct a SimpleReplacement to replace self with replacement.
replacement must be a hugr with dataflow graph 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.
Sourcepub fn extract_subgraph(
&self,
hugr: &impl HugrView<Node = N>,
name: impl Into<String>,
) -> Hugr
pub fn extract_subgraph( &self, hugr: &impl HugrView<Node = N>, name: impl Into<String>, ) -> Hugr
Create a new Hugr containing only the subgraph.
The new Hugr will contain a FuncDefn root
with the same signature as the subgraph and the specified name
Sourcepub fn set_outgoing_ports(
&mut self,
ports: OutgoingPorts<N>,
host: &impl HugrView<Node = N>,
) -> Result<(), InvalidOutputPorts<N>>
pub fn set_outgoing_ports( &mut self, ports: OutgoingPorts<N>, host: &impl HugrView<Node = N>, ) -> Result<(), InvalidOutputPorts<N>>
Change the output boundary of the subgraph.
All ports of the new boundary must be contained in the old boundary, i.e. the only changes that are allowed are copying, discarding and shuffling existing ports in the output boundary.
Returns an error if the new boundary is invalid (contains ports not in the old boundary
or has non-unique linear ports). In this case, self is left unchanged.
Trait Implementations§
Source§impl<N: Clone> Clone for SiblingSubgraph<N>
impl<N: Clone> Clone for SiblingSubgraph<N>
Source§fn clone(&self) -> SiblingSubgraph<N>
fn clone(&self) -> SiblingSubgraph<N>
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreSource§impl<N: Debug> Debug for SiblingSubgraph<N>
impl<N: Debug> Debug for SiblingSubgraph<N>
Source§impl<'de, N> Deserialize<'de> for SiblingSubgraph<N>where
N: Deserialize<'de>,
impl<'de, N> Deserialize<'de> for SiblingSubgraph<N>where
N: Deserialize<'de>,
Source§fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
Source§impl<N: PartialEq> PartialEq for SiblingSubgraph<N>
impl<N: PartialEq> PartialEq for SiblingSubgraph<N>
Source§impl<N> Serialize for SiblingSubgraph<N>where
N: Serialize,
impl<N> Serialize for SiblingSubgraph<N>where
N: Serialize,
impl<N: Eq> Eq for SiblingSubgraph<N>
impl<N> StructuralPartialEq for SiblingSubgraph<N>
Auto Trait Implementations§
impl<N> Freeze for SiblingSubgraph<N>
impl<N> RefUnwindSafe for SiblingSubgraph<N>where
N: RefUnwindSafe,
impl<N> Send for SiblingSubgraph<N>where
N: Send,
impl<N> Sync for SiblingSubgraph<N>where
N: Sync,
impl<N> Unpin for SiblingSubgraph<N>where
N: Unpin,
impl<N> UnwindSafe for SiblingSubgraph<N>where
N: UnwindSafe,
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> DowncastSend for T
impl<T> DowncastSend for T
Source§impl<T> DowncastSync for T
impl<T> DowncastSync for T
Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
key and return true if they are equal.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> 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 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> Serialize for T
impl<T> Serialize for T
fn erased_serialize(&self, serializer: &mut dyn Serializer) -> Result<(), Error>
fn do_erased_serialize( &self, serializer: &mut dyn Serializer, ) -> Result<(), ErrorImpl>
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.