pub mod sg_from_centroids;
pub mod sg_from_motives;
#[cfg(test)]
mod tests;
use crate::analysis::motives::MotiveConfig;
use crate::core::ArrowSpace;
use crate::graph::GraphLaplacian;
#[derive(Clone, Debug)]
pub struct SubgraphConfig {
pub motives: MotiveConfig,
pub rayleigh_max: Option<f64>,
pub min_size: usize,
}
impl Default for SubgraphConfig {
fn default() -> Self {
Self {
motives: MotiveConfig::default(),
rayleigh_max: None,
min_size: 3,
}
}
}
#[derive(Clone, Debug)]
pub struct Subgraph {
pub node_indices: Vec<usize>,
pub item_indices: Option<Vec<usize>>,
pub laplacian: GraphLaplacian,
pub rayleigh: Option<f64>,
}
pub trait SubgraphsMotive {
fn spot_subg_motives(&self, aspace: &ArrowSpace, cfg: &SubgraphConfig) -> Vec<Subgraph>;
}
pub trait SubgraphsCentroid {
fn spot_subg_centroids(
&self,
aspace: &ArrowSpace,
params: &CentroidGraphParams,
) -> Vec<Subgraph>;
fn build_centroid_hierarchy(
&self,
aspace: &ArrowSpace,
params: CentroidGraphParams,
) -> CentroidHierarchy;
}
#[derive(Clone)]
pub struct CentroidNode {
pub graph: Subgraph,
pub parent_map: Vec<usize>,
pub root_indices: Vec<Vec<usize>>,
pub children: Vec<CentroidNode>,
}
pub struct CentroidHierarchy {
pub root: CentroidNode,
pub levels: Vec<Vec<CentroidNode>>,
}
#[derive(Clone)]
pub struct CentroidGraphParams {
pub eps: f64,
pub k: usize,
pub topk: usize,
pub p: f64,
pub sigma: Option<f64>,
pub normalise: bool,
pub sparsitycheck: bool,
pub seed: Option<u64>,
pub min_centroids: usize,
pub max_depth: usize,
}
impl Default for CentroidGraphParams {
fn default() -> Self {
Self {
eps: 0.5,
k: 16,
topk: 16,
p: 2.0,
sigma: None,
normalise: false,
sparsitycheck: false,
seed: None,
min_centroids: 8,
max_depth: 2,
}
}
}