use std::fmt;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum GraphLayoutRequirement {
Forward,
Transposed,
Any,
}
impl GraphLayoutRequirement {
pub const fn as_str(self) -> &'static str {
match self {
Self::Forward => "forward",
Self::Transposed => "transposed",
Self::Any => "any",
}
}
}
impl fmt::Display for GraphLayoutRequirement {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.write_str(self.as_str())
}
}
#[derive(Debug, Clone, PartialEq)]
pub struct GraphForceAtlas2Params {
pub max_iter: u32,
pub outbound_attraction_distribution: bool,
pub lin_log_mode: bool,
pub prevent_overlapping: bool,
pub overlap_scaling_ratio: f64,
pub edge_weight_influence: f64,
pub jitter_tolerance: f64,
pub barnes_hut_optimize: bool,
pub barnes_hut_theta: f64,
pub scaling_ratio: f64,
pub strong_gravity_mode: bool,
pub gravity: f64,
pub verbose: bool,
pub seed: u64,
pub vertex_attributes: Option<GraphForceAtlas2VertexAttributesInput>,
pub initial_positions: Option<GraphForceAtlas2InitialPositionsInput>,
}
impl GraphForceAtlas2Params {
pub(crate) fn side_input_ordinals(&self) -> impl Iterator<Item = usize> + '_ {
self.vertex_attributes
.iter()
.map(|input| input.input)
.chain(self.initial_positions.iter().map(|input| input.input))
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct GraphForceAtlas2VertexAttributesInput {
pub input: usize,
pub vertex: String,
pub radius: Option<String>,
pub mobility: Option<String>,
pub mass: Option<String>,
}
impl GraphForceAtlas2VertexAttributesInput {
pub fn new(
input: usize,
vertex: impl Into<String>,
radius: Option<impl Into<String>>,
mobility: Option<impl Into<String>>,
mass: Option<impl Into<String>>,
) -> Self {
Self {
input,
vertex: vertex.into(),
radius: radius.map(Into::into),
mobility: mobility.map(Into::into),
mass: mass.map(Into::into),
}
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct GraphForceAtlas2InitialPositionsInput {
pub input: usize,
pub vertex: String,
pub x: String,
pub y: String,
}
impl GraphForceAtlas2InitialPositionsInput {
pub fn new(input: usize, vertex: impl Into<String>, x: impl Into<String>, y: impl Into<String>) -> Self {
Self { input, vertex: vertex.into(), x: x.into(), y: y.into() }
}
}
impl Default for GraphForceAtlas2Params {
fn default() -> Self {
Self {
max_iter: 500,
outbound_attraction_distribution: false,
lin_log_mode: false,
prevent_overlapping: false,
overlap_scaling_ratio: 2.0,
edge_weight_influence: 1.0,
jitter_tolerance: 1.0,
barnes_hut_optimize: false,
barnes_hut_theta: 0.5,
scaling_ratio: 2.0,
strong_gravity_mode: false,
gravity: 1.0,
verbose: false,
seed: 0,
vertex_attributes: None,
initial_positions: None,
}
}
}