hugr_core::hugr::views::sibling_subgraph

Struct SiblingSubgraph

source
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

source

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.

source

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.

source

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.

source

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).

source

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.

source

pub fn nodes(&self) -> &[Node]

An iterator over the nodes in the subgraph.

source

pub fn node_count(&self) -> usize

The number of nodes in the subgraph.

source

pub fn incoming_ports(&self) -> &IncomingPorts

Returns the computed IncomingPorts of the subgraph.

source

pub fn outgoing_ports(&self) -> &OutgoingPorts

Returns the computed OutgoingPorts of the subgraph.

source

pub fn signature(&self, hugr: &impl HugrView) -> Signature

The signature of the subgraph.

source

pub fn get_parent(&self, hugr: &impl HugrView) -> Node

The parent of the sibling subgraph.

source

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

At the moment we do not support state order edges. If any are found in the replacement graph, this will panic.

source

pub fn extract_subgraph( &self, hugr: &impl HugrView, 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

Trait Implementations§

source§

impl Clone for SiblingSubgraph

source§

fn clone(&self) -> SiblingSubgraph

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for SiblingSubgraph

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for T
where T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> CloneToUninit for T
where T: Clone,

source§

unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
source§

impl<T> Conv for T

source§

fn conv<T>(self) -> T
where Self: Into<T>,

Converts self into T using Into<T>. Read more
source§

impl<T> Downcast for T
where T: Any,

source§

fn into_any(self: Box<T>) -> Box<dyn Any>

Convert 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>

Convert 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)

Convert &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)

Convert &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
where T: Any + Send + Sync,

source§

fn into_any_arc(self: Arc<T>) -> Arc<dyn Any + Send + Sync>

Convert Arc<Trait> (where Trait: Downcast) to Arc<Any>. Arc<Any> can then be further downcast into Arc<ConcreteType> where ConcreteType implements Trait.
source§

impl<T> FmtForward for T

source§

fn fmt_binary(self) -> FmtBinary<Self>
where Self: Binary,

Causes self to use its Binary implementation when Debug-formatted.
source§

fn fmt_display(self) -> FmtDisplay<Self>
where Self: Display,

Causes self to use its Display implementation when Debug-formatted.
source§

fn fmt_lower_exp(self) -> FmtLowerExp<Self>
where Self: LowerExp,

Causes self to use its LowerExp implementation when Debug-formatted.
source§

fn fmt_lower_hex(self) -> FmtLowerHex<Self>
where Self: LowerHex,

Causes self to use its LowerHex implementation when Debug-formatted.
source§

fn fmt_octal(self) -> FmtOctal<Self>
where Self: Octal,

Causes self to use its Octal implementation when Debug-formatted.
source§

fn fmt_pointer(self) -> FmtPointer<Self>
where Self: Pointer,

Causes self to use its Pointer implementation when Debug-formatted.
source§

fn fmt_upper_exp(self) -> FmtUpperExp<Self>
where Self: UpperExp,

Causes self to use its UpperExp implementation when Debug-formatted.
source§

fn fmt_upper_hex(self) -> FmtUpperHex<Self>
where Self: UpperHex,

Causes self to use its UpperHex implementation when Debug-formatted.
source§

fn fmt_list(self) -> FmtList<Self>
where &'a Self: for<'a> IntoIterator,

Formats each item in a sequence. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

source§

impl<T, U> Into<U> for T
where U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

source§

impl<T> IntoEither for T

source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts 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 more
source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts 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
source§

impl<T> Pipe for T
where T: ?Sized,

source§

fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> R
where Self: Sized,

Pipes by value. This is generally the method you want to use. Read more
source§

fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> R
where R: 'a,

Borrows self and passes that borrow into the pipe function. Read more
source§

fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> R
where R: 'a,

Mutably borrows self and passes that borrow into the pipe function. Read more
source§

fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
where Self: Borrow<B>, B: 'a + ?Sized, R: 'a,

Borrows self, then passes self.borrow() into the pipe function. Read more
source§

fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
where Self: BorrowMut<B>, B: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.borrow_mut() into the pipe function. Read more
source§

fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
where Self: AsRef<U>, U: 'a + ?Sized, R: 'a,

Borrows 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
where Self: AsMut<U>, U: 'a + ?Sized, R: 'a,

Mutably borrows 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
where Self: Deref<Target = T>, T: 'a + ?Sized, R: 'a,

Borrows self, then passes self.deref() into the pipe function.
source§

fn pipe_deref_mut<'a, T, R>( &'a mut self, func: impl FnOnce(&'a mut T) -> R, ) -> R
where Self: DerefMut<Target = T> + Deref, T: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.deref_mut() into the pipe function.
source§

impl<T> Tap for T

source§

fn tap(self, func: impl FnOnce(&Self)) -> Self

Immutable access to a value. Read more
source§

fn tap_mut(self, func: impl FnOnce(&mut Self)) -> Self

Mutable access to a value. Read more
source§

fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
where Self: Borrow<B>, B: ?Sized,

Immutable access to the Borrow<B> of a value. Read more
source§

fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
where Self: BorrowMut<B>, B: ?Sized,

Mutable access to the BorrowMut<B> of a value. Read more
source§

fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
where Self: AsRef<R>, R: ?Sized,

Immutable access to the AsRef<R> view of a value. Read more
source§

fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
where Self: AsMut<R>, R: ?Sized,

Mutable access to the AsMut<R> view of a value. Read more
source§

fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
where Self: Deref<Target = T>, T: ?Sized,

Immutable access to the Deref::Target of a value. Read more
source§

fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
where Self: DerefMut<Target = T> + Deref, T: ?Sized,

Mutable access to the Deref::Target of a value. Read more
source§

fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self

Calls .tap() only in debug builds, and is erased in release builds.
source§

fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self

Calls .tap_mut() only in debug builds, and is erased in release builds.
source§

fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
where Self: Borrow<B>, B: ?Sized,

Calls .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
where Self: BorrowMut<B>, B: ?Sized,

Calls .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
where Self: AsRef<R>, R: ?Sized,

Calls .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
where Self: AsMut<R>, R: ?Sized,

Calls .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
where Self: Deref<Target = T>, T: ?Sized,

Calls .tap_deref() only in debug builds, and is erased in release builds.
source§

fn tap_deref_mut_dbg<T>(self, func: impl FnOnce(&mut T)) -> Self
where Self: DerefMut<Target = T> + Deref, T: ?Sized,

Calls .tap_deref_mut() only in debug builds, and is erased in release builds.
source§

impl<T> ToOwned for T
where T: Clone,

source§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T> TryConv for T

source§

fn try_conv<T>(self) -> Result<T, Self::Error>
where Self: TryInto<T>,

Attempts to convert self into T using TryInto<T>. Read more
source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

source§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.