Struct SimpleReplacement

Source
pub struct SimpleReplacement<HostNode = Node> { /* private fields */ }
Expand description

Specification of a simple replacement operation.

§Type parameters

  • N: The type of nodes in the host hugr.

Implementations§

Source§

impl<N> SimpleReplacement<N>

Source

pub fn from_serial<H: Into<Hugr>>(value: SerialSimpleReplacement<H, N>) -> Self

Create a new SimpleReplacement from its serialized format

Source

pub fn into_serial<H: From<Hugr>>(self) -> SerialSimpleReplacement<H, N>

Convert a SimpleReplacement into its serialized format

Source

pub fn to_serial<'a, H>(&'a self) -> SerialSimpleReplacement<H, N>
where N: Clone, H: From<&'a Hugr>,

Create its serialized format from a reference to SimpleReplacement

Source§

impl<HostNode: HugrNode> SimpleReplacement<HostNode>

Source

pub fn new_unchecked( subgraph: SiblingSubgraph<HostNode>, replacement: Hugr, ) -> Self

Create a new SimpleReplacement specification without checking that the replacement has the same signature as the subgraph.

Source

pub fn try_new( subgraph: SiblingSubgraph<HostNode>, host: &impl HugrView<Node = HostNode>, replacement: Hugr, ) -> Result<Self, InvalidReplacement>

Create a new SimpleReplacement specification.

Return a InvalidReplacement::InvalidSignature error if subgraph and replacement have different signatures.

Source

pub fn replacement(&self) -> &Hugr

The replacement hugr.

Source

pub fn into_replacement(self) -> Hugr

Consume self and return the replacement hugr.

Source

pub fn subgraph(&self) -> &SiblingSubgraph<HostNode>

Subgraph to be replaced.

Source

pub fn is_valid_rewrite( &self, h: &impl HugrView<Node = HostNode>, ) -> Result<(), SimpleReplacementError>

Check if the replacement can be applied to the given hugr.

Source

pub fn get_replacement_io(&self) -> [Node; 2]

Get the input and output nodes of the replacement hugr.

Source

pub fn linked_replacement_output( &self, port: impl Into<HostPort<HostNode, IncomingPort>>, host: &impl HugrView<Node = HostNode>, boundary: BoundaryMode, ) -> Option<BoundaryPort<HostNode, OutgoingPort>>

Traverse output boundary edge from host to replacement.

Given an incoming port in host linked to an output boundary port of subgraph, return the port it will be linked to after application of self.

The returned port will be in replacement, unless the wire in the replacement is empty and boundary is BoundaryMode::SnapToHost (the default), in which case it will be another host port. If BoundaryMode::IncludeIO is passed, the returned port will always be in replacement even if it is invalid (i.e. it is an IO node in the replacement).

Source

pub fn linked_host_outputs( &self, port: impl Into<ReplacementPort<OutgoingPort>>, host: &impl HugrView<Node = HostNode>, ) -> impl Iterator<Item = HostPort<HostNode, IncomingPort>>

Traverse output boundary edge from replacement to host.

port must be an outgoing port linked to the output node of replacement.

This is the inverse of Self::linked_replacement_output, in the case where the latter returns a BoundaryPort::Replacement port.

Source

pub fn linked_replacement_inputs<'a>( &'a self, port: impl Into<HostPort<HostNode, OutgoingPort>>, host: &'a impl HugrView<Node = HostNode>, boundary: BoundaryMode, ) -> impl Iterator<Item = BoundaryPort<HostNode, IncomingPort>> + 'a

Traverse input boundary edge from host to replacement.

Given an outgoing port in host linked to an input boundary port of subgraph, return the ports it will be linked to after application of self.

The returned ports will be in replacement, unless the wires in the replacement are empty and boundary is BoundaryMode::SnapToHost (the default), in which case they will be other host ports. If BoundaryMode::IncludeIO is passed, the returned ports will always be in replacement even if they are invalid (i.e. they are an IO node in the replacement).

Source

pub fn linked_host_input( &self, port: impl Into<ReplacementPort<IncomingPort>>, host: &impl HugrView<Node = HostNode>, ) -> HostPort<HostNode, OutgoingPort>

Traverse output boundary edge from replacement to host.

port must be an outgoing port linked to the output node of replacement.

This is the inverse of Self::linked_replacement_output, in the case where the latter returns a BoundaryPort::Replacement port.

Source

pub fn incoming_boundary<'a>( &'a self, host: &'a impl HugrView<Node = HostNode>, ) -> impl Iterator<Item = (HostPort<HostNode, OutgoingPort>, ReplacementPort<IncomingPort>)> + 'a

Get all edges that the replacement would add from outgoing ports in host to incoming ports in self.replacement.

For each pair in the returned vector, the first element is a port in host and the second is a port in self.replacement:

  • The outgoing host ports are always linked to the input boundary of subgraph, i.e. the ports returned by SiblingSubgraph::incoming_ports,
  • The incoming replacement ports are always linked to output ports of the OpTag::Input node of self.replacement.
Source

pub fn outgoing_boundary<'a>( &'a self, host: &'a impl HugrView<Node = HostNode>, ) -> impl Iterator<Item = (ReplacementPort<OutgoingPort>, HostPort<HostNode, IncomingPort>)> + 'a

Get all edges that the replacement would add from outgoing ports in self.replacement to incoming ports in host.

For each pair in the returned vector, the first element is a port in self.replacement and the second is a port in host:

  • The outgoing replacement ports are always linked to inputs of the OpTag::Output node of self.replacement,
  • The incoming host ports are always linked to the output boundary of subgraph, i.e. the ports returned by SiblingSubgraph::outgoing_ports,

This panics if self.replacement is not a DFG.

Source

pub fn host_to_host_boundary<'a>( &'a self, host: &'a impl HugrView<Node = HostNode>, ) -> impl Iterator<Item = (HostPort<HostNode, OutgoingPort>, HostPort<HostNode, IncomingPort>)> + 'a

Get all edges that the replacement would add between ports in host.

These correspond to direct edges between the input and output nodes in the replacement graph.

For each pair in the returned vector, both ports are in host:

This panics if self.replacement is not a DFG.

Source

pub fn map_host_output( &self, port: impl Into<HostPort<HostNode, OutgoingPort>>, ) -> Option<ReplacementPort<IncomingPort>>

Get the incoming port at the output node of self.replacement that corresponds to the given outgoing port on the subgraph output boundary.

The host port should be a port in self.subgraph().outgoing_ports().

This panics if self.replacement is not a DFG.

Source

pub fn map_replacement_input( &self, port: impl Into<ReplacementPort<OutgoingPort>>, ) -> impl Iterator<Item = HostPort<HostNode, IncomingPort>> + '_

Get the incoming port in subgraph that corresponds to the given replacement input port.

This panics if self.replacement is not a DFG.

Source

pub fn all_boundary_edges<'a>( &'a self, host: &'a impl HugrView<Node = HostNode>, ) -> impl Iterator<Item = (BoundaryPort<HostNode, OutgoingPort>, BoundaryPort<HostNode, IncomingPort>)> + 'a

Get all edges that the replacement would add between host and self.replacement.

This is equivalent to chaining the results of Self::incoming_boundary, Self::outgoing_boundary, and Self::host_to_host_boundary.

This panics if self.replacement is not a DFG.

Source

pub fn map_host_nodes<N: HugrNode>( &self, node_map: impl Fn(HostNode) -> N, new_host: &impl HugrView<Node = N>, ) -> Result<SimpleReplacement<N>, InvalidReplacement>

Map the host nodes in self according to node_map.

node_map must map nodes in the current HUGR of the subgraph to its equivalent nodes in some new_host.

This converts a replacement that acts on nodes of type HostNode to a replacement that acts on new_host, with nodes of type N.

Source

pub fn invalidation_set(&self) -> impl Iterator<Item = HostNode>

Allows to get the Self::invalidated_nodes without requiring a HugrView.

Trait Implementations§

Source§

impl<HostNode: Clone> Clone for SimpleReplacement<HostNode>

Source§

fn clone(&self) -> SimpleReplacement<HostNode>

Returns a duplicate 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<HostNode: Debug> Debug for SimpleReplacement<HostNode>

Source§

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

Formats the value using the given formatter. Read more
Source§

impl<H: Into<Hugr>, N> From<SerialSimpleReplacement<H, N>> for SimpleReplacement<N>

Source§

fn from(value: SerialSimpleReplacement<H, N>) -> Self

Converts to this type from the input type.
Source§

impl<N, H: From<Hugr>> From<SimpleReplacement<N>> for SerialSimpleReplacement<H, N>

Source§

fn from(value: SimpleReplacement<N>) -> Self

Converts to this type from the input type.
Source§

impl<N: HugrNode> PatchHugrMut for SimpleReplacement<N>

Source§

const UNCHANGED_ON_FAILURE: bool = true

If true, [self.apply]’s of this rewrite guarantee that they do not mutate the Hugr when they return an Err. If false, there is no guarantee; the Hugr should be assumed invalid when Err is returned.
Source§

type Outcome = Outcome<N>

The type returned on successful application of the rewrite.
Source§

fn apply_hugr_mut( self, h: &mut impl HugrMut<Node = N>, ) -> Result<Self::Outcome, Self::Error>

Mutate the specified Hugr, or fail with an error. Read more
Source§

impl<HostNode: HugrNode> PatchVerification for SimpleReplacement<HostNode>

Source§

type Error = SimpleReplacementError

The type of Error with which this Rewrite may fail
Source§

type Node = HostNode

The node type of the HugrView that this patch applies to.
Source§

fn verify( &self, h: &impl HugrView<Node = HostNode>, ) -> Result<(), SimpleReplacementError>

Checks whether the rewrite would succeed on the specified Hugr. If this call succeeds, Patch::apply should also succeed on the same h If this calls fails, Patch::apply would fail with the same error.
Source§

fn invalidated_nodes( &self, _: &impl HugrView<Node = Self::Node>, ) -> impl Iterator<Item = Self::Node>

Returns the nodes removed or altered by the rewrite. Modifying any of these nodes will invalidate the rewrite. Read more
Source§

fn invalidation_set(&self) -> impl Iterator<Item = Self::Node>

👎Deprecated: Use/implement invalidated_nodes instead
The nodes invalidated by the rewrite. Deprecated: implement Self::invalidated_nodes instead. The default returns the empty iterator; this should be fine as there are no external calls.

Auto Trait Implementations§

§

impl<HostNode = Node> !Freeze for SimpleReplacement<HostNode>

§

impl<HostNode = Node> !RefUnwindSafe for SimpleReplacement<HostNode>

§

impl<HostNode> Send for SimpleReplacement<HostNode>
where HostNode: Send,

§

impl<HostNode> Sync for SimpleReplacement<HostNode>
where HostNode: Sync,

§

impl<HostNode> Unpin for SimpleReplacement<HostNode>
where HostNode: Unpin,

§

impl<HostNode = Node> !UnwindSafe for SimpleReplacement<HostNode>

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, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. 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>

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

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

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

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

Source§

fn into_any_send(self: Box<T>) -> Box<dyn Any + Send>

Converts Box<Trait> (where Trait: DowncastSend) to Box<dyn Any + Send>, which can then be downcast into Box<ConcreteType> where ConcreteType implements Trait.
Source§

impl<T> DowncastSync for T
where T: Any + Send + Sync,

Source§

fn into_any_sync(self: Box<T>) -> Box<dyn Any + Sync + Send>

Converts Box<Trait> (where Trait: DowncastSync) to Box<dyn Any + Send + Sync>, which can then be downcast into Box<ConcreteType> where ConcreteType implements Trait.
Source§

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

Converts Arc<Trait> (where Trait: DowncastSync) to Arc<Any>, which can then be 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> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
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<R, H> Patch<H> for R
where R: PatchHugrMut, H: HugrMut<Node = <R as PatchVerification>::Node>,

Source§

const UNCHANGED_ON_FAILURE: bool = const UNCHANGED_ON_FAILURE: bool = R::UNCHANGED_ON_FAILURE;

If true, Patch::apply’s of this rewrite guarantee that they do not mutate the Hugr when they return an Err. If false, there is no guarantee; the Hugr should be assumed invalid when Err is returned.
Source§

type Outcome = <R as PatchHugrMut>::Outcome

The type returned on successful application of the rewrite.
Source§

fn apply( self, h: &mut H, ) -> Result<<R as Patch<H>>::Outcome, <R as PatchVerification>::Error>

Mutate the specified Hugr, or fail with an error. 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.
Source§

impl<'a, S, T> View<'a, &S> for T
where T: View<'a, S>, S: Copy,

Source§

fn view(module: &'a Module<'a>, id: &S) -> Option<T>

Attempt to interpret a subpart of a module as this type.
Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more