use crate::{
algorithms::{
components::weakly_connected_components,
layout::fruchterman_reingold::{fruchterman_reingold_unbounded, CoordinateState},
},
db::api::state::TypedNodeState,
prelude::{NodeStateGroupBy, OrderedNodeStateOps, *},
};
pub fn cohesive_fruchterman_reingold<'graph, G: GraphViewOps<'graph>>(
g: &G,
iter_count: u64,
scale: f32,
node_start_size: f32,
cooloff_factor: f32,
dt: f32,
) -> TypedNodeState<'graph, CoordinateState, G> {
let virtual_graph = g.materialize().unwrap();
let connected_components = weakly_connected_components(&virtual_graph).groups();
if connected_components.len() > 1 {
let degrees = virtual_graph.nodes().degree();
let bridge_node = degrees.max_item().unwrap().0;
for (_, isolated_nodes) in connected_components.iter() {
virtual_graph
.add_edge(
0,
&bridge_node,
&isolated_nodes.degree().max_item().unwrap().0,
NO_PROPS,
None,
)
.unwrap();
}
}
fruchterman_reingold_unbounded(g, iter_count, scale, node_start_size, cooloff_factor, dt)
}