pub struct ReductionGraph { /* private fields */ }Expand description
Runtime graph of all registered reductions.
Uses type-erased names for the graph topology, so MaxCut<i32> and MaxCut<f64>
map to the same node “MaxCut”. This allows finding reduction paths regardless
of weight type parameters.
The graph supports:
- Auto-discovery of reductions from
inventory::iter::<ReductionEntry> - Graph hierarchy from
inventory::iter::<GraphSubtypeEntry> - Set-theoretic validation for path finding
- Dijkstra with custom cost functions
Implementations§
Source§impl ReductionGraph
impl ReductionGraph
Sourcepub fn new() -> Self
pub fn new() -> Self
Create a new reduction graph with all registered reductions from inventory.
Sourcepub fn is_graph_subtype(&self, sub: &str, sup: &str) -> bool
pub fn is_graph_subtype(&self, sub: &str, sup: &str) -> bool
Check if sub is a subtype of sup (or equal).
Sourcepub fn rule_applicable(
&self,
want_source_graph: &str,
want_target_graph: &str,
rule_source_graph: &str,
rule_target_graph: &str,
) -> bool
pub fn rule_applicable( &self, want_source_graph: &str, want_target_graph: &str, rule_source_graph: &str, rule_target_graph: &str, ) -> bool
Check if a reduction rule can be used.
For a reduction from problem A (on graph type G_A) to problem B (on graph type G_B), using a rule that reduces C (on G_C) to D (on G_D):
The rule is applicable if:
- G_A is a subtype of G_C (our source graph is more specific than rule requires)
- G_D is a subtype of G_B (rule produces a graph that fits our target requirement)
Sourcepub fn find_cheapest_path<C: PathCostFn>(
&self,
source: (&str, &str),
target: (&str, &str),
input_size: &ProblemSize,
cost_fn: &C,
) -> Option<ReductionPath>
pub fn find_cheapest_path<C: PathCostFn>( &self, source: (&str, &str), target: (&str, &str), input_size: &ProblemSize, cost_fn: &C, ) -> Option<ReductionPath>
Find the cheapest path using a custom cost function.
Uses Dijkstra’s algorithm with set-theoretic validation.
§Arguments
source: (problem_name, graph_type) for sourcetarget: (problem_name, graph_type) for targetinput_size: Initial problem size for cost calculationscost_fn: Custom cost function for path optimization
§Returns
The cheapest path if one exists that satisfies the graph type constraints.
Sourcepub fn find_paths<S: 'static, T: 'static>(&self) -> Vec<ReductionPath>
pub fn find_paths<S: 'static, T: 'static>(&self) -> Vec<ReductionPath>
Find all paths from source to target type.
Uses type-erased names, so find_paths::<MaxCut<i32>, SpinGlass<f64>>()
will find paths even though the weight types differ.
Sourcepub fn find_paths_by_name(&self, src: &str, dst: &str) -> Vec<ReductionPath>
pub fn find_paths_by_name(&self, src: &str, dst: &str) -> Vec<ReductionPath>
Find all paths between problem types by name.
Sourcepub fn find_shortest_path<S: 'static, T: 'static>(
&self,
) -> Option<ReductionPath>
pub fn find_shortest_path<S: 'static, T: 'static>( &self, ) -> Option<ReductionPath>
Find the shortest path from source to target type.
Sourcepub fn find_shortest_path_by_name(
&self,
src: &str,
dst: &str,
) -> Option<ReductionPath>
pub fn find_shortest_path_by_name( &self, src: &str, dst: &str, ) -> Option<ReductionPath>
Find the shortest path by name.
Sourcepub fn has_direct_reduction<S: 'static, T: 'static>(&self) -> bool
pub fn has_direct_reduction<S: 'static, T: 'static>(&self) -> bool
Check if a direct reduction exists from S to T.
Sourcepub fn has_direct_reduction_by_name(&self, src: &str, dst: &str) -> bool
pub fn has_direct_reduction_by_name(&self, src: &str, dst: &str) -> bool
Check if a direct reduction exists by name.
Sourcepub fn problem_types(&self) -> Vec<&'static str>
pub fn problem_types(&self) -> Vec<&'static str>
Get all registered problem type names (base names).
Sourcepub fn num_reductions(&self) -> usize
pub fn num_reductions(&self) -> usize
Get the number of registered reductions.
Source§impl ReductionGraph
impl ReductionGraph
Sourcepub fn to_json(&self) -> ReductionGraphJson
pub fn to_json(&self) -> ReductionGraphJson
Export the reduction graph as a JSON-serializable structure.
Sourcepub fn to_json_string(&self) -> Result<String, Error>
pub fn to_json_string(&self) -> Result<String, Error>
Export the reduction graph as a JSON string.
Sourcepub fn to_json_file(&self, path: &Path) -> Result<()>
pub fn to_json_file(&self, path: &Path) -> Result<()>
Export the reduction graph to a JSON file.
Trait Implementations§
Auto Trait Implementations§
impl Freeze for ReductionGraph
impl RefUnwindSafe for ReductionGraph
impl Send for ReductionGraph
impl Sync for ReductionGraph
impl Unpin for ReductionGraph
impl UnwindSafe for ReductionGraph
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
§impl<T> Conv for T
impl<T> Conv for T
§impl<T> FmtForward for T
impl<T> FmtForward for T
§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.§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.§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.§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.§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.§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.§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.§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.§fn fmt_list(self) -> FmtList<Self>where
&'a Self: for<'a> IntoIterator,
fn fmt_list(self) -> FmtList<Self>where
&'a Self: for<'a> IntoIterator,
§impl<T> Pipe for Twhere
T: ?Sized,
impl<T> Pipe for Twhere
T: ?Sized,
§fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
§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 more§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 more§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
§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
§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.§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.§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.§impl<T> Tap for T
impl<T> Tap for T
§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 more§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 more§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 more§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 more§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 more§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 more§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.§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.§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.§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.§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.§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.§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.