use std::ptr;
use cugraph_sys::{cugraph_betweenness_centrality, cugraph_centrality_result_t, cugraph_error_t};
use super::BetweennessCentralityResult;
use crate::{
array::DeviceArrayView,
error::{Result, check_error, require_non_null},
graph::Graph,
handle::EnteredContext,
types::{CugraphElement, to_bool_t},
};
#[derive(Debug, Clone, Copy)]
#[must_use]
pub struct BetweennessCentralityParams {
pub normalized: bool,
pub include_endpoints: bool,
pub do_expensive_check: bool,
}
impl Default for BetweennessCentralityParams {
fn default() -> Self {
Self { normalized: true, include_endpoints: false, do_expensive_check: false }
}
}
pub(crate) fn betweenness_centrality<T, V: CugraphElement>(
handle: &EnteredContext<'_>,
graph: &mut Graph<T>,
vertex_list: Option<&DeviceArrayView<'_, V>>,
params: &BetweennessCentralityParams,
) -> Result<BetweennessCentralityResult> {
let mut result: *mut cugraph_centrality_result_t = ptr::null_mut();
let mut error: *mut cugraph_error_t = ptr::null_mut();
let vertex_list_ptr = vertex_list.map(|v| v.as_ptr() as *const _).unwrap_or(ptr::null());
let do_expensive_check = params.do_expensive_check || vertex_list.is_some();
let graph_ptr = graph.as_ptr(handle, "betweenness_centrality")?;
unsafe {
let code = cugraph_betweenness_centrality(
handle.handle_ptr(),
graph_ptr,
vertex_list_ptr,
to_bool_t(params.normalized),
to_bool_t(params.include_endpoints),
to_bool_t(do_expensive_check),
&mut result,
&mut error,
);
check_error(code, error, handle.device(), "betweenness_centrality")?;
}
let result = require_non_null(result, "betweenness_centrality", "centrality_result")?;
unsafe { BetweennessCentralityResult::from_raw(result, handle.device(), handle.runtime_bound_lease()) }
}