Struct EGraph

Source
pub struct EGraph {
    pub nodes: IndexMap<NodeId, Node>,
    pub root_eclasses: Vec<ClassId>,
    pub class_data: IndexMap<ClassId, ClassData>,
    /* private fields */
}

Fields§

§nodes: IndexMap<NodeId, Node>§root_eclasses: Vec<ClassId>§class_data: IndexMap<ClassId, ClassData>

Implementations§

Source§

impl EGraph

Source

pub fn inline_leaves(&mut self) -> usize

Inline all leaves (e-classes with a single node that has no children) into their parents, so that they are added to the function name like f(10, ·). Returns the number of leaves inlined.

Source

pub fn saturate_inline_leaves(&mut self)

Inline all leaves (e-classes with a single node that has no children) into their parents, recursively.

Source

pub fn split_classes(&mut self, should_split: impl Fn(&NodeId, &Node) -> bool)

Given some function should_split, after calling this method, all nodes where it is true will have at most one other node in their e-class and if they have parents, will no other nodes in their e-class.

All nodes in an e-class shared with a split node will still be in a e-class with that node, but no longer in an e-class with each other.

This is used to help make the visualization easier to parse, by breaking cycles and allowing these split nodes to be later inlined into their parents with inline_leaves, which only applies when there is a single node in an e-class.

For example, if we split on all “primitive” nodes or their wrappers, like Int(1), then those nodes can then be inlined into their parents and are all nodes equal to them are no longer in single e-class, making the graph layout easier to understand.

Note that should_split should only ever be true for either a single node, or no nodes, in an e-class. If it is true for multiple nodes in an e-class, then this method will panic.

Another way to think about it is that any isomporphic function can be split, since if f(a) = f(b) then a = b, in that case.

Source§

impl EGraph

Source

pub fn add_node(&mut self, node_id: impl Into<NodeId>, node: Node)

Adds a new node to the egraph

Panics if a node with the same id already exists

Source

pub fn nid_to_cid(&self, node_id: &NodeId) -> &ClassId

Source

pub fn nid_to_class(&self, node_id: &NodeId) -> &Class

Source

pub fn classes(&self) -> &IndexMap<ClassId, Class>

Groups the nodes in the e-graph by their e-class

This is only done once and then the result is cached. Modifications to the e-graph will not be reflected in later calls to this function.

Source

pub fn from_json_file(path: impl AsRef<Path>) -> Result<Self>

Source

pub fn to_json_file(&self, path: impl AsRef<Path>) -> Result<()>

Source

pub fn test_round_trip(&self)

Trait Implementations§

Source§

impl Clone for EGraph

Source§

fn clone(&self) -> EGraph

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 Debug for EGraph

Source§

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

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

impl Default for EGraph

Source§

fn default() -> EGraph

Returns the “default value” for a type. Read more
Source§

impl<'de> Deserialize<'de> for EGraph

Source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
Source§

impl Index<&ClassId> for EGraph

Source§

type Output = Class

The returned type after indexing.
Source§

fn index(&self, index: &ClassId) -> &Self::Output

Performs the indexing (container[index]) operation. Read more
Source§

impl Index<&NodeId> for EGraph

Source§

type Output = Node

The returned type after indexing.
Source§

fn index(&self, index: &NodeId) -> &Self::Output

Performs the indexing (container[index]) operation. Read more
Source§

impl PartialEq for EGraph

Source§

fn eq(&self, other: &EGraph) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
Source§

impl Serialize for EGraph

Source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where __S: Serializer,

Serialize this value into the given Serde serializer. Read more
Source§

impl Eq for EGraph

Source§

impl StructuralPartialEq for EGraph

Auto Trait Implementations§

§

impl !Freeze for EGraph

§

impl RefUnwindSafe for EGraph

§

impl Send for EGraph

§

impl Sync for EGraph

§

impl Unpin for EGraph

§

impl UnwindSafe for EGraph

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<Q, K> Equivalent<K> for Q
where Q: Eq + ?Sized, K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where Q: Eq + ?Sized, K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
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> 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, 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<T> DeserializeOwned for T
where T: for<'de> Deserialize<'de>,