use std::num::NonZeroUsize;
use super::{Forward, Graph, Transposed, Transposition};
use crate::{
array::DeviceArrayView,
centrality::{
BetweennessCentralityParams, BetweennessCentralityResult, CentralityResult, EdgeBetweennessCentralityParams,
EdgeBetweennessCentralityResult, HitsResult,
betweenness::betweenness_centrality,
edge_betweenness::edge_betweenness_centrality,
hits::{HitsInitialHubs, HitsParams, hits},
pagerank::{
InitialGuess, PageRankParams, PersonalizationVector, PersonalizedPageRankParams, PrecomputedWeights,
pagerank, personalized_pagerank,
},
vertex::{EigenvectorCentralityParams, KatzCentralityParams, eigenvector_centrality, katz_centrality},
},
community::{
EcgResult, ExtractEgoParams, ExtractEgoResult, KTrussSubgraphParams, KTrussSubgraphResult, LeidenResult,
LouvainResult, SpectralClusteringResult, TriangleCountResult,
clustering::{
SpectralClusteringParams, analyze_clustering_edge_cut, analyze_clustering_modularity,
analyze_clustering_ratio_cut, spectral_modularity_maximization,
},
ecg::{EcgParams, ecg},
leiden::{LeidenParams, leiden},
louvain::{LouvainParams, louvain},
subgraph::{extract_ego, k_truss_subgraph},
triangle_count::{TriangleCountParams, triangle_count},
},
error::Result,
handle::EnteredContext,
labeling::{
ConnectedComponentsParams, LabelingResult,
connected_components::{strongly_connected_components, weakly_connected_components},
},
layout::force_atlas2::{ForceAtlas2Params, ForceAtlas2VertexAttrs, InitialPositions, LayoutResult, force_atlas2},
random::RngState,
sampling::{
NeighborSamplingParams, Node2VecRandomWalkParams, RandomWalkParams, RandomWalkResult, SampleResult,
biased_random_walks, homogeneous_biased_neighbor_sample, homogeneous_biased_temporal_neighbor_sample,
homogeneous_uniform_neighbor_sample, homogeneous_uniform_temporal_neighbor_sample, node2vec_random_walks,
uniform_random_walks,
},
similarity::{
AllPairsSimilarityParams, CosineSimilarityResult, JaccardSimilarityResult, OverlapSimilarityResult,
SimilarityParams, SorensenSimilarityResult, VertexPairs, all_pairs_cosine_similarity_coefficients,
all_pairs_jaccard_coefficients, all_pairs_overlap_coefficients, all_pairs_sorensen_coefficients,
cosine_similarity_coefficients, create_vertex_pairs, jaccard_coefficients, overlap_coefficients,
sorensen_coefficients,
},
structure::{
CoreNumberParams, CoreNumberResult, DegreesResult, InDegreesResult, KCoreParams, KCoreResult, OutDegreesResult,
VertexSelection,
core::{core_number, k_core},
degrees::{degrees, in_degrees, out_degrees},
},
traversal::{
bfs::{BfsParams, BfsPredicateParams, BfsResult, bfs, bfs_with_predicates},
sssp::{SsspParams, SsspResult, sssp},
},
tree::{MinimumSpanningTreeParams, MinimumSpanningTreeResult, minimum_spanning_tree::minimum_spanning_tree},
types::CugraphElement,
};
impl Graph<Transposed> {
pub fn pagerank(&mut self, handle: &EnteredContext<'_>, params: &PageRankParams) -> Result<CentralityResult> {
pagerank::<i32, f32>(handle, self, params, None, None)
}
pub fn pagerank_with<V: CugraphElement, W: CugraphElement>(
&mut self,
handle: &EnteredContext<'_>,
params: &PageRankParams,
precomputed_weights: Option<&PrecomputedWeights<'_, V, W>>,
initial_guess: Option<&InitialGuess<'_, V, W>>,
) -> Result<CentralityResult> {
pagerank(handle, self, params, precomputed_weights, initial_guess)
}
pub fn personalized_pagerank<V: CugraphElement, W: CugraphElement>(
&mut self,
handle: &EnteredContext<'_>,
params: &PersonalizedPageRankParams,
personalization: &PersonalizationVector<'_, V, W>,
) -> Result<CentralityResult> {
personalized_pagerank(handle, self, params, personalization, None, None)
}
pub fn personalized_pagerank_with<V: CugraphElement, W: CugraphElement>(
&mut self,
handle: &EnteredContext<'_>,
params: &PersonalizedPageRankParams,
personalization: &PersonalizationVector<'_, V, W>,
precomputed_weights: Option<&PrecomputedWeights<'_, V, W>>,
initial_guess: Option<&InitialGuess<'_, V, W>>,
) -> Result<CentralityResult> {
personalized_pagerank(handle, self, params, personalization, precomputed_weights, initial_guess)
}
pub fn eigenvector_centrality(
&mut self,
handle: &EnteredContext<'_>,
params: &EigenvectorCentralityParams,
) -> Result<CentralityResult> {
eigenvector_centrality(handle, self, params)
}
pub fn katz_centrality(
&mut self,
handle: &EnteredContext<'_>,
params: &KatzCentralityParams,
) -> Result<CentralityResult> {
katz_centrality(handle, self, params)
}
pub fn hits(&mut self, handle: &EnteredContext<'_>, params: &HitsParams) -> Result<HitsResult> {
hits::<i32, f32>(handle, self, params, None)
}
pub fn hits_with_initial_hubs<V: CugraphElement, W: CugraphElement>(
&mut self,
handle: &EnteredContext<'_>,
params: &HitsParams,
initial_hubs: Option<&HitsInitialHubs<'_, V, W>>,
) -> Result<HitsResult> {
hits(handle, self, params, initial_hubs)
}
pub fn degrees<'a, V: CugraphElement + 'a>(
&mut self,
handle: &EnteredContext<'_>,
vertices: impl Into<VertexSelection<'a, V>>,
) -> Result<DegreesResult> {
let vertices = vertices.into();
self.validate_vertex_selection(&vertices, "Graph::degrees", "vertices", true)?;
let resolved = vertices.resolve(handle)?;
let view = resolved.view()?;
degrees(handle, self, view.as_ref(), false)
}
pub fn degrees_checked<'a, V: CugraphElement + 'a>(
&mut self,
handle: &EnteredContext<'_>,
vertices: impl Into<VertexSelection<'a, V>>,
do_expensive_check: bool,
) -> Result<DegreesResult> {
let vertices = vertices.into();
self.validate_vertex_selection(&vertices, "Graph::degrees", "vertices", true)?;
let resolved = vertices.resolve(handle)?;
let view = resolved.view()?;
degrees(handle, self, view.as_ref(), do_expensive_check)
}
pub fn degrees_all(&mut self, handle: &EnteredContext<'_>) -> Result<DegreesResult> {
self.degrees(handle, VertexSelection::<i32>::All)
}
pub fn in_degrees<'a, V: CugraphElement + 'a>(
&mut self,
handle: &EnteredContext<'_>,
vertices: impl Into<VertexSelection<'a, V>>,
) -> Result<InDegreesResult> {
let vertices = vertices.into();
self.validate_vertex_selection(&vertices, "Graph::in_degrees", "vertices", true)?;
let resolved = vertices.resolve(handle)?;
let view = resolved.view()?;
in_degrees(handle, self, view.as_ref(), false)
}
pub fn in_degrees_checked<'a, V: CugraphElement + 'a>(
&mut self,
handle: &EnteredContext<'_>,
vertices: impl Into<VertexSelection<'a, V>>,
do_expensive_check: bool,
) -> Result<InDegreesResult> {
let vertices = vertices.into();
self.validate_vertex_selection(&vertices, "Graph::in_degrees", "vertices", true)?;
let resolved = vertices.resolve(handle)?;
let view = resolved.view()?;
in_degrees(handle, self, view.as_ref(), do_expensive_check)
}
pub fn in_degrees_all(&mut self, handle: &EnteredContext<'_>) -> Result<InDegreesResult> {
self.in_degrees(handle, VertexSelection::<i32>::All)
}
}
impl Graph<Forward> {
pub fn bfs<'a, V: CugraphElement + 'a>(
&mut self,
handle: &EnteredContext<'_>,
sources: impl Into<VertexSelection<'a, V>>,
params: &BfsParams,
) -> Result<BfsResult> {
let sources = sources.into();
self.validate_vertex_selection(&sources, "Graph::bfs", "sources", false)?;
let resolved = sources.resolve(handle)?;
let view = self.resolved_vertex_view(&resolved, "Graph::bfs", "sources")?;
bfs(handle, self, &view, params)
}
pub fn bfs_with_predicates<'a, V, E>(
&mut self,
handle: &EnteredContext<'_>,
sources: impl Into<VertexSelection<'a, V>>,
params: &BfsParams,
predicates: &BfsPredicateParams<'a, V, E>,
) -> Result<BfsResult>
where
V: CugraphElement + 'a,
E: CugraphElement + 'a,
{
let sources = sources.into();
self.validate_vertex_selection(&sources, "Graph::bfs_with_predicates", "sources", false)?;
let resolved = sources.resolve(handle)?;
let view = self.resolved_vertex_view(&resolved, "Graph::bfs_with_predicates", "sources")?;
bfs_with_predicates(handle, self, &view, params, predicates)
}
pub fn sssp<V>(&mut self, handle: &EnteredContext<'_>, source: V, params: &SsspParams) -> Result<SsspResult>
where V: CugraphElement + TryInto<usize> + Copy + std::fmt::Debug {
self.validate_vertex_input_dtype(V::data_type(), "Graph::sssp", "source")?;
let weight_mode = if self.has_weights { "weighted" } else { "unit_weight" };
sssp(handle, self, source, params).map_err(|error| error.with_context("weight_mode", weight_mode))
}
pub fn uniform_random_walks<V: CugraphElement>(
&mut self,
handle: &EnteredContext<'_>,
rng_state: &mut RngState,
start_vertices: &DeviceArrayView<'_, V>,
params: &RandomWalkParams,
) -> Result<RandomWalkResult> {
uniform_random_walks(handle, rng_state, self, start_vertices, params)
}
pub fn biased_random_walks<V: CugraphElement>(
&mut self,
handle: &EnteredContext<'_>,
rng_state: &mut RngState,
start_vertices: &DeviceArrayView<'_, V>,
params: &RandomWalkParams,
) -> Result<RandomWalkResult> {
biased_random_walks(handle, rng_state, self, start_vertices, params)
}
pub fn node2vec_random_walks<V: CugraphElement>(
&mut self,
handle: &EnteredContext<'_>,
rng_state: &mut RngState,
start_vertices: &DeviceArrayView<'_, V>,
params: &Node2VecRandomWalkParams,
) -> Result<RandomWalkResult> {
node2vec_random_walks(handle, rng_state, self, start_vertices, params)
}
pub fn homogeneous_uniform_neighbor_sample<V: CugraphElement>(
&mut self,
handle: &EnteredContext<'_>,
rng_state: &mut RngState,
start_vertices: &DeviceArrayView<'_, V>,
starting_vertex_label_offsets: Option<&DeviceArrayView<'_, usize>>,
params: &NeighborSamplingParams,
) -> Result<SampleResult> {
homogeneous_uniform_neighbor_sample(
handle,
rng_state,
self,
start_vertices,
starting_vertex_label_offsets,
params,
)
}
pub fn homogeneous_biased_neighbor_sample<V: CugraphElement>(
&mut self,
handle: &EnteredContext<'_>,
rng_state: &mut RngState,
start_vertices: &DeviceArrayView<'_, V>,
starting_vertex_label_offsets: Option<&DeviceArrayView<'_, usize>>,
params: &NeighborSamplingParams,
) -> Result<SampleResult> {
homogeneous_biased_neighbor_sample(
handle,
rng_state,
self,
start_vertices,
starting_vertex_label_offsets,
params,
)
}
pub fn homogeneous_uniform_temporal_neighbor_sample<V, Tm>(
&mut self,
handle: &EnteredContext<'_>,
rng_state: &mut RngState,
temporal_property_name: &str,
start_vertices: &DeviceArrayView<'_, V>,
starting_vertex_times: Option<&DeviceArrayView<'_, Tm>>,
starting_vertex_label_offsets: Option<&DeviceArrayView<'_, usize>>,
params: &NeighborSamplingParams,
) -> Result<SampleResult>
where
V: CugraphElement,
Tm: CugraphElement,
{
homogeneous_uniform_temporal_neighbor_sample(
handle,
rng_state,
self,
temporal_property_name,
start_vertices,
starting_vertex_times,
starting_vertex_label_offsets,
params,
)
}
pub fn homogeneous_biased_temporal_neighbor_sample<V, Tm>(
&mut self,
handle: &EnteredContext<'_>,
rng_state: &mut RngState,
temporal_property_name: &str,
start_vertices: &DeviceArrayView<'_, V>,
starting_vertex_times: Option<&DeviceArrayView<'_, Tm>>,
starting_vertex_label_offsets: Option<&DeviceArrayView<'_, usize>>,
params: &NeighborSamplingParams,
) -> Result<SampleResult>
where
V: CugraphElement,
Tm: CugraphElement,
{
homogeneous_biased_temporal_neighbor_sample(
handle,
rng_state,
self,
temporal_property_name,
start_vertices,
starting_vertex_times,
starting_vertex_label_offsets,
params,
)
}
pub fn louvain(&mut self, handle: &EnteredContext<'_>, params: &LouvainParams) -> Result<LouvainResult> {
louvain(handle, self, params)
}
pub fn leiden(
&mut self,
handle: &EnteredContext<'_>,
rng_state: &mut RngState,
params: &LeidenParams,
) -> Result<LeidenResult> {
leiden(handle, rng_state, self, params)
}
pub fn ecg(
&mut self,
handle: &EnteredContext<'_>,
rng_state: &mut RngState,
params: &EcgParams,
) -> Result<EcgResult> {
ecg(handle, rng_state, self, params)
}
pub fn spectral_modularity_maximization(
&mut self,
handle: &EnteredContext<'_>,
rng_state: &mut RngState,
params: &SpectralClusteringParams,
) -> Result<SpectralClusteringResult> {
spectral_modularity_maximization(handle, rng_state, self, params)
}
pub fn analyze_clustering_modularity<V: CugraphElement>(
&mut self,
handle: &EnteredContext<'_>,
n_clusters: NonZeroUsize,
vertices: &DeviceArrayView<'_, V>,
clusters: &DeviceArrayView<'_, V>,
) -> Result<f64> {
analyze_clustering_modularity(handle, self, n_clusters, vertices, clusters)
}
pub fn analyze_clustering_edge_cut<V: CugraphElement>(
&mut self,
handle: &EnteredContext<'_>,
n_clusters: NonZeroUsize,
vertices: &DeviceArrayView<'_, V>,
clusters: &DeviceArrayView<'_, V>,
) -> Result<f64> {
analyze_clustering_edge_cut(handle, self, n_clusters, vertices, clusters)
}
pub fn analyze_clustering_ratio_cut<V: CugraphElement>(
&mut self,
handle: &EnteredContext<'_>,
n_clusters: NonZeroUsize,
vertices: &DeviceArrayView<'_, V>,
clusters: &DeviceArrayView<'_, V>,
) -> Result<f64> {
analyze_clustering_ratio_cut(handle, self, n_clusters, vertices, clusters)
}
}
impl<T: Transposition> Graph<T> {
pub fn betweenness_centrality<'a, V: CugraphElement + 'a>(
&mut self,
handle: &EnteredContext<'_>,
vertex_list: impl Into<VertexSelection<'a, V>>,
params: &BetweennessCentralityParams,
) -> Result<BetweennessCentralityResult> {
let vertex_list = vertex_list.into();
self.validate_vertex_selection(&vertex_list, "Graph::betweenness_centrality", "vertex_list", true)?;
let resolved = vertex_list.resolve(handle)?;
let view = resolved.view()?;
betweenness_centrality(handle, self, view.as_ref(), params)
}
pub fn betweenness_centrality_all(
&mut self,
handle: &EnteredContext<'_>,
params: &BetweennessCentralityParams,
) -> Result<BetweennessCentralityResult> {
self.betweenness_centrality(handle, VertexSelection::<i32>::All, params)
}
pub fn edge_betweenness_centrality<'a, V: CugraphElement + 'a>(
&mut self,
handle: &EnteredContext<'_>,
vertex_list: impl Into<VertexSelection<'a, V>>,
params: &EdgeBetweennessCentralityParams,
) -> Result<EdgeBetweennessCentralityResult> {
let vertex_list = vertex_list.into();
self.validate_vertex_selection(&vertex_list, "Graph::edge_betweenness_centrality", "vertex_list", true)?;
let resolved = vertex_list.resolve(handle)?;
let view = resolved.view()?;
edge_betweenness_centrality(handle, self, view.as_ref(), params)
}
pub fn edge_betweenness_centrality_all(
&mut self,
handle: &EnteredContext<'_>,
params: &EdgeBetweennessCentralityParams,
) -> Result<EdgeBetweennessCentralityResult> {
self.edge_betweenness_centrality(handle, VertexSelection::<i32>::All, params)
}
pub fn weakly_connected_components(
&mut self,
handle: &EnteredContext<'_>,
params: &ConnectedComponentsParams,
) -> Result<LabelingResult> {
weakly_connected_components(handle, self, params)
}
pub fn strongly_connected_components(
&mut self,
handle: &EnteredContext<'_>,
params: &ConnectedComponentsParams,
) -> Result<LabelingResult> {
strongly_connected_components(handle, self, params)
}
pub fn core_number(&mut self, handle: &EnteredContext<'_>, params: &CoreNumberParams) -> Result<CoreNumberResult> {
core_number(handle, self, params)
}
pub fn k_core(&mut self, handle: &EnteredContext<'_>, params: &KCoreParams) -> Result<KCoreResult> {
k_core(handle, self, params, None)
}
pub fn k_core_with_core_numbers(
&mut self,
handle: &EnteredContext<'_>,
params: &KCoreParams,
core_numbers: &CoreNumberResult,
) -> Result<KCoreResult> {
k_core(handle, self, params, Some(core_numbers))
}
pub fn minimum_spanning_tree(
&mut self,
handle: &EnteredContext<'_>,
params: &MinimumSpanningTreeParams,
) -> Result<MinimumSpanningTreeResult> {
minimum_spanning_tree(handle, self, params)
}
pub fn vertex_pairs<'a, V: CugraphElement + 'a>(
&mut self,
handle: &EnteredContext<'_>,
first: impl Into<VertexSelection<'a, V>>,
second: impl Into<VertexSelection<'a, V>>,
) -> Result<VertexPairs> {
let first = first.into();
let second = second.into();
self.validate_vertex_selection(&first, "Graph::vertex_pairs", "first", false)?;
self.validate_vertex_selection(&second, "Graph::vertex_pairs", "second", false)?;
let first = first.resolve(handle)?;
let second = second.resolve(handle)?;
let first_view = self.resolved_vertex_view(&first, "Graph::vertex_pairs", "first")?;
let second_view = self.resolved_vertex_view(&second, "Graph::vertex_pairs", "second")?;
create_vertex_pairs(handle, self, &first_view, &second_view)
.map_err(|error| error.with_operation("Graph::vertex_pairs"))
}
pub fn jaccard_coefficients(
&mut self,
handle: &EnteredContext<'_>,
pairs: VertexPairs,
params: &SimilarityParams,
) -> Result<JaccardSimilarityResult> {
jaccard_coefficients(handle, self, pairs, params)
}
pub fn sorensen_coefficients(
&mut self,
handle: &EnteredContext<'_>,
pairs: VertexPairs,
params: &SimilarityParams,
) -> Result<SorensenSimilarityResult> {
sorensen_coefficients(handle, self, pairs, params)
}
pub fn overlap_coefficients(
&mut self,
handle: &EnteredContext<'_>,
pairs: VertexPairs,
params: &SimilarityParams,
) -> Result<OverlapSimilarityResult> {
overlap_coefficients(handle, self, pairs, params)
}
pub fn cosine_similarity_coefficients(
&mut self,
handle: &EnteredContext<'_>,
pairs: VertexPairs,
params: &SimilarityParams,
) -> Result<CosineSimilarityResult> {
cosine_similarity_coefficients(handle, self, pairs, params)
}
pub fn all_pairs_jaccard_coefficients<'a, V: CugraphElement + 'a>(
&mut self,
handle: &EnteredContext<'_>,
vertices: impl Into<VertexSelection<'a, V>>,
params: &AllPairsSimilarityParams,
) -> Result<JaccardSimilarityResult> {
let vertices = vertices.into();
self.validate_vertex_selection(&vertices, "Graph::all_pairs_jaccard_coefficients", "vertices", true)?;
let resolved = vertices.resolve(handle)?;
let view = resolved.view()?;
all_pairs_jaccard_coefficients(handle, self, view.as_ref(), params)
}
pub fn all_pairs_sorensen_coefficients<'a, V: CugraphElement + 'a>(
&mut self,
handle: &EnteredContext<'_>,
vertices: impl Into<VertexSelection<'a, V>>,
params: &AllPairsSimilarityParams,
) -> Result<SorensenSimilarityResult> {
let vertices = vertices.into();
self.validate_vertex_selection(&vertices, "Graph::all_pairs_sorensen_coefficients", "vertices", true)?;
let resolved = vertices.resolve(handle)?;
let view = resolved.view()?;
all_pairs_sorensen_coefficients(handle, self, view.as_ref(), params)
}
pub fn all_pairs_overlap_coefficients<'a, V: CugraphElement + 'a>(
&mut self,
handle: &EnteredContext<'_>,
vertices: impl Into<VertexSelection<'a, V>>,
params: &AllPairsSimilarityParams,
) -> Result<OverlapSimilarityResult> {
let vertices = vertices.into();
self.validate_vertex_selection(&vertices, "Graph::all_pairs_overlap_coefficients", "vertices", true)?;
let resolved = vertices.resolve(handle)?;
let view = resolved.view()?;
all_pairs_overlap_coefficients(handle, self, view.as_ref(), params)
}
pub fn all_pairs_cosine_similarity_coefficients<'a, V: CugraphElement + 'a>(
&mut self,
handle: &EnteredContext<'_>,
vertices: impl Into<VertexSelection<'a, V>>,
params: &AllPairsSimilarityParams,
) -> Result<CosineSimilarityResult> {
let vertices = vertices.into();
self.validate_vertex_selection(&vertices, "Graph::all_pairs_cosine_similarity_coefficients", "vertices", true)?;
let resolved = vertices.resolve(handle)?;
let view = resolved.view()?;
all_pairs_cosine_similarity_coefficients(handle, self, view.as_ref(), params)
}
pub fn force_atlas2(
&mut self,
handle: &EnteredContext<'_>,
rng_state: &mut RngState,
params: &ForceAtlas2Params,
) -> Result<LayoutResult> {
force_atlas2::<T, i32, f32>(handle, rng_state, self, params, None, None)
}
pub fn force_atlas2_with<V: CugraphElement, W: CugraphElement>(
&mut self,
handle: &EnteredContext<'_>,
rng_state: &mut RngState,
params: &ForceAtlas2Params,
vertex_attrs: Option<&ForceAtlas2VertexAttrs<'_, V, W>>,
initial_positions: Option<&InitialPositions<'_, V, W>>,
) -> Result<LayoutResult> {
force_atlas2(handle, rng_state, self, params, vertex_attrs, initial_positions)
}
pub fn out_degrees<'a, V: CugraphElement + 'a>(
&mut self,
handle: &EnteredContext<'_>,
vertices: impl Into<VertexSelection<'a, V>>,
) -> Result<OutDegreesResult> {
let vertices = vertices.into();
self.validate_vertex_selection(&vertices, "Graph::out_degrees", "vertices", true)?;
let resolved = vertices.resolve(handle)?;
let view = resolved.view()?;
out_degrees(handle, self, view.as_ref(), false)
}
pub fn out_degrees_checked<'a, V: CugraphElement + 'a>(
&mut self,
handle: &EnteredContext<'_>,
vertices: impl Into<VertexSelection<'a, V>>,
do_expensive_check: bool,
) -> Result<OutDegreesResult> {
let vertices = vertices.into();
self.validate_vertex_selection(&vertices, "Graph::out_degrees", "vertices", true)?;
let resolved = vertices.resolve(handle)?;
let view = resolved.view()?;
out_degrees(handle, self, view.as_ref(), do_expensive_check)
}
pub fn out_degrees_all(&mut self, handle: &EnteredContext<'_>) -> Result<OutDegreesResult> {
self.out_degrees(handle, VertexSelection::<i32>::All)
}
pub fn triangle_count<'a, V: CugraphElement + 'a>(
&mut self,
handle: &EnteredContext<'_>,
start_vertices: impl Into<VertexSelection<'a, V>>,
params: &TriangleCountParams,
) -> Result<TriangleCountResult> {
let start_vertices = start_vertices.into();
self.validate_vertex_selection(&start_vertices, "Graph::triangle_count", "start_vertices", true)?;
let resolved = start_vertices.resolve(handle)?;
let view = resolved.view()?;
triangle_count(handle, self, view.as_ref(), params)
}
pub fn triangle_count_all(
&mut self,
handle: &EnteredContext<'_>,
params: &TriangleCountParams,
) -> Result<TriangleCountResult> {
self.triangle_count(handle, VertexSelection::<i32>::All, params)
}
pub fn k_truss_subgraph(
&mut self,
handle: &EnteredContext<'_>,
params: &KTrussSubgraphParams,
) -> Result<KTrussSubgraphResult> {
k_truss_subgraph(handle, self, params)
}
pub fn extract_ego<'a, V: CugraphElement + 'a>(
&mut self,
handle: &EnteredContext<'_>,
source_vertices: impl Into<VertexSelection<'a, V>>,
params: &ExtractEgoParams,
) -> Result<ExtractEgoResult> {
let source_vertices = source_vertices.into();
self.validate_vertex_selection(&source_vertices, "Graph::extract_ego", "source_vertices", false)?;
let resolved = source_vertices.resolve(handle)?;
let view = self.resolved_vertex_view(&resolved, "Graph::extract_ego", "source_vertices")?;
extract_ego(handle, self, &view, params)
}
}