use std::ptr;
use cugraph_sys::{cugraph_error_t, cugraph_induced_subgraph_result_t, cugraph_minimum_spanning_tree};
use crate::{
cudf_interop::minimum_spanning_tree_result_to_dataframe,
error::{Error, Result, check_error, require_non_null},
graph::Graph,
handle::EnteredContext,
structure::{
subgraph::InducedSubgraphResult,
typed_results::{IntegerValues, ScoreValues, SizeValues, VertexIds},
},
types::to_bool_t,
};
#[derive(Debug, Clone, Copy, Default)]
#[must_use]
pub struct MinimumSpanningTreeParams {
pub do_expensive_check: bool,
}
pub(crate) fn minimum_spanning_tree<T>(
handle: &EnteredContext<'_>,
graph: &mut Graph<T>,
params: &MinimumSpanningTreeParams,
) -> Result<MinimumSpanningTreeResult> {
let mut result: *mut cugraph_induced_subgraph_result_t = ptr::null_mut();
let mut error: *mut cugraph_error_t = ptr::null_mut();
let graph_ptr = graph.as_ptr(handle, "minimum_spanning_tree")?;
unsafe {
let code = cugraph_minimum_spanning_tree(
handle.handle_ptr(),
graph_ptr,
to_bool_t(params.do_expensive_check),
&mut result,
&mut error,
);
check_error(code, error, handle.device(), "minimum_spanning_tree")?;
}
let result = require_non_null(result, "minimum_spanning_tree", "induced_subgraph_result")?;
let inner = unsafe {
InducedSubgraphResult::from_raw(result, handle.device(), "minimum_spanning_tree", handle.runtime_bound_lease())
}?;
Ok(MinimumSpanningTreeResult(inner))
}
pub struct MinimumSpanningTreeResult(InducedSubgraphResult);
impl std::fmt::Debug for MinimumSpanningTreeResult {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("MinimumSpanningTreeResult").finish_non_exhaustive()
}
}
impl MinimumSpanningTreeResult {
pub fn sources(&self) -> Result<VertexIds<'_>> {
self.0.sources("MinimumSpanningTreeResult::sources")
}
pub fn destinations(&self) -> Result<VertexIds<'_>> {
self.0.destinations("MinimumSpanningTreeResult::destinations")
}
pub fn weights(&self) -> Result<Option<ScoreValues<'_>>> {
self.0.weights("MinimumSpanningTreeResult::weights")
}
pub fn edge_ids(&self) -> Result<Option<IntegerValues<'_>>> {
self.0.edge_ids("MinimumSpanningTreeResult::edge_ids")
}
pub fn edge_type_ids(&self) -> Result<Option<IntegerValues<'_>>> {
self.0.edge_type_ids("MinimumSpanningTreeResult::edge_type_ids")
}
pub fn subgraph_offsets(&self) -> Result<Option<SizeValues<'_>>> {
self.0.subgraph_offsets("MinimumSpanningTreeResult::subgraph_offsets")
}
pub fn to_dataframe(&self, runtime: &cudf::Runtime) -> Result<cudf::DataFrame> {
minimum_spanning_tree_result_to_dataframe(self, runtime)
.map_err(|e: Error| e.with_operation("MinimumSpanningTreeResult::to_dataframe"))
}
}