use std::collections::HashMap;
use std::str::from_utf8;
use simd_csv::TotalReader;
use fa2::{FA2Data, FA2Settings};
fn les_miserables(weighted: bool) -> FA2Data<f32> {
let data = include_bytes!("resources/les-miserables.csv");
let mut reader = TotalReader::from_bytes(data);
let mut data = FA2Data::new();
let mut nodes = HashMap::<Vec<u8>, usize>::new();
for record in reader.byte_records() {
let source = &record[0];
let target = &record[1];
let source_id = *nodes
.entry(source.to_vec())
.or_insert_with(|| data.add_node(0.0, 0.0));
let target_id = *nodes
.entry(target.to_vec())
.or_insert_with(|| data.add_node(0.0, 0.0));
data.add_edge_with_weight(
source_id,
target_id,
if weighted {
from_utf8(&record[2]).unwrap().parse().unwrap()
} else {
1.0
},
);
}
data.apply_circular_layout();
data
}
#[test]
fn test_basic() {
let data = les_miserables(false);
let settings = FA2Settings::from_graph_order(data.order());
let mut layout = settings.build(data);
layout.run(10);
assert_eq!(
layout.data().positions().collect::<Vec<_>>(),
[
(136.68904, 23.265457),
(138.03792, 41.912155),
(100.65079, 67.50165),
(102.62769, 58.692856),
(129.41559, 53.696735),
(131.26448, 46.912388),
(131.3319, 33.956577),
(146.54187, 28.348387),
(152.67928, 22.24318),
(160.8669, 14.400837),
(-3.4364235, 47.320934),
(4.9898405, 102.84976),
(-1.6326631, 102.38997),
(43.554165, 75.30678),
(53.45345, 72.87247),
(60.87948, 66.54313),
(63.7122, 147.6712),
(28.47492, 118.10571),
(53.591805, 151.73312),
(41.311825, 150.55505),
(29.19296, 158.0917),
(34.143723, 171.45479),
(50.00446, 168.23459),
(-9.804123, 125.01409),
(-21.818068, 35.78978),
(-16.058249, 2.4776106),
(-49.81229, 5.145705),
(-37.36767, 40.38111),
(-91.18534, 11.725938),
(-111.19355, 78.9926),
(-72.12823, 89.90233),
(-53.21691, 93.78319),
(-22.261688, 67.65112),
(-37.54775, 77.44999),
(-103.1262, 66.6769),
(-101.908104, 80.63642),
(-109.50941, 58.27013),
(-123.34933, 53.197212),
(-109.47814, 43.887383),
(-77.85676, -41.79448),
(-65.45961, 33.76318),
(-9.946019, -30.218115),
(-64.46615, 2.5457685),
(-57.941414, 29.859205),
(-64.00783, 10.911146),
(-124.15175, -8.281068),
(-110.24126, -28.58418),
(-147.42262, -5.219117),
(19.799404, -65.7981),
(-68.01414, -52.639305),
(-56.97167, -24.21299),
(-88.41556, -50.61082),
(-90.26852, -67.35068),
(-112.23599, -75.824036),
(-96.83802, -60.168594),
(-33.246727, -77.58396),
(-72.551155, -102.527504),
(-11.418563, -119.9521),
(9.375995, -93.89985),
(19.07956, -138.66788),
(28.947575, -153.07361),
(3.2850537, -143.13687),
(21.861378, -114.65954),
(40.279232, -136.86232),
(42.556507, -99.71401),
(52.835983, -121.122894),
(64.87739, -133.1373),
(14.836996, -90.63688),
(22.41362, -6.0748086),
(20.254576, 10.379258),
(36.467564, 2.3070242),
(47.130817, 12.461362),
(20.690817, 52.0677),
(31.162817, -41.726864),
(41.799656, -44.76132),
(49.605312, -17.679691),
(70.346214, -95.29234)
]
);
}
#[test]
fn test_weighted() {
let data = les_miserables(true);
let settings = FA2Settings::from_graph_order(data.order());
let mut layout = settings.build(data);
layout.run(10);
assert_eq!(
layout.data().positions().collect::<Vec<_>>(),
[
(249.06027, 3.078642),
(227.15924, 56.824203),
(228.10461, 80.5332),
(213.9865, 87.559586),
(207.80116, 71.55936),
(239.62387, 27.551823),
(246.69891, 22.12498),
(254.08434, 15.011099),
(279.05484, 35.1745),
(279.4174, -14.286642),
(-29.465078, 73.99174),
(-54.14211, 195.61568),
(-9.043808, 229.69043),
(49.66787, 147.23419),
(76.5823, 132.48526),
(99.78859, 119.00034),
(138.39343, 258.80865),
(102.082344, 243.93741),
(139.33495, 283.81604),
(116.66822, 276.79904),
(88.800995, 279.21786),
(79.87054, 302.20517),
(107.49028, 302.9053),
(27.088842, 220.11626),
(-43.245132, 144.67502),
(5.331393, 122.3986),
(-92.92561, 43.04589),
(-43.019634, 38.83214),
(-133.3725, 36.04314),
(-187.04962, 88.32565),
(-147.4414, 173.34566),
(-101.797325, 156.83533),
(-58.22995, 73.02992),
(-73.015114, 113.52107),
(-171.01514, 95.94294),
(-187.72775, 114.41897),
(-189.58458, 71.059494),
(-188.99048, 94.10771),
(-210.60385, 73.848434),
(-144.17453, -24.970726),
(-101.81829, 144.7493),
(-9.315261, -1.7072363),
(-103.636536, 73.53488),
(-35.515774, 47.215343),
(-170.0687, 23.910637),
(-211.04842, 9.041402),
(-164.50761, -39.593147),
(-255.52107, 29.798285),
(28.024845, -115.27161),
(-162.98735, -55.053947),
(-151.43854, 9.715413),
(-159.41429, -75.31898),
(-185.43973, -102.89044),
(-226.7575, -105.55954),
(-202.54422, -61.21622),
(-69.49065, -66.4748),
(-155.56064, -132.87758),
(-41.622322, -169.7901),
(-0.31383836, -167.8294),
(59.212723, -237.25296),
(48.464535, -179.6672),
(48.894936, -205.94353),
(3.1511364, -226.89467),
(69.792244, -156.59679),
(80.706024, -199.62393),
(108.47414, -175.16563),
(120.17689, -149.64166),
(-5.3226566, -99.59938),
(92.015, 59.875988),
(72.16716, 84.34459),
(97.35451, 84.36529),
(108.290054, 43.939903),
(-32.869053, 20.958504),
(111.80777, -51.482903),
(105.9158, -60.482697),
(78.30279, 43.303738),
(112.846725, -126.27548)
]
);
}
#[test]
fn test_parallel() {
let data = les_miserables(false);
let settings = FA2Settings::from_graph_order(data.order()).parallel(true);
let mut layout = settings.build(data);
layout.run(10);
assert_eq!(
layout.data().positions().collect::<Vec<_>>(),
[
(136.68904, 23.26544),
(138.03793, 41.912178),
(100.65079, 67.50164),
(102.627686, 58.692844),
(129.41554, 53.696712),
(131.2644, 46.912304),
(131.33188, 33.956554),
(146.54185, 28.348385),
(152.67926, 22.243174),
(160.86688, 14.400831),
(-3.4364626, 47.320976),
(4.9898353, 102.84979),
(-1.6326627, 102.39),
(43.554165, 75.30677),
(53.45345, 72.87247),
(60.879463, 66.54312),
(63.71222, 147.67125),
(28.474941, 118.105705),
(53.59182, 151.73312),
(41.311832, 150.5551),
(29.192987, 158.09186),
(34.143757, 171.45491),
(50.00448, 168.2346),
(-9.80405, 125.01421),
(-21.818022, 35.789867),
(-16.058262, 2.4777198),
(-49.812332, 5.145693),
(-37.36761, 40.38117),
(-91.18519, 11.725923),
(-111.19406, 78.99445),
(-72.12817, 89.90286),
(-53.216908, 93.78328),
(-22.261599, 67.6517),
(-37.547764, 77.45001),
(-103.12606, 66.6772),
(-101.908394, 80.6367),
(-109.51049, 58.272312),
(-123.34945, 53.197388),
(-109.47819, 43.887165),
(-77.85663, -41.794563),
(-65.4596, 33.763195),
(-9.946251, -30.21809),
(-64.46646, 2.546015),
(-57.94143, 29.85932),
(-64.00734, 10.910902),
(-124.151726, -8.281058),
(-110.24128, -28.584164),
(-147.42264, -5.219104),
(19.799255, -65.79804),
(-68.01394, -52.639294),
(-56.97162, -24.21285),
(-88.41531, -50.610634),
(-90.2686, -67.35065),
(-112.2355, -75.82385),
(-96.83796, -60.16851),
(-33.246723, -77.583984),
(-72.55117, -102.52751),
(-11.418601, -119.95214),
(9.375988, -93.89979),
(19.079548, -138.6678),
(28.94719, -153.07358),
(3.2850027, -143.13672),
(21.86124, -114.65952),
(40.278976, -136.86179),
(42.556664, -99.71434),
(52.83564, -121.12241),
(64.87791, -133.13734),
(14.837056, -90.63693),
(22.413422, -6.0747547),
(20.254648, 10.379435),
(36.467762, 2.3067253),
(47.13069, 12.461489),
(20.69084, 52.06765),
(31.162739, -41.726852),
(41.799606, -44.761375),
(49.605183, -17.679796),
(70.34616, -95.29256)
]
);
}
#[test]
fn test_barnes_hut() {
let data = les_miserables(true);
let settings = FA2Settings::from_graph_order(data.order()).with_barnes_hut();
let mut layout = settings.build(data);
layout.run(10);
assert_eq!(
layout.data().positions().collect::<Vec<_>>(),
[
(192.00958, 14.105058),
(202.75063, 17.192753),
(196.67776, 29.249945),
(194.66862, 46.31686),
(168.70108, 61.13224),
(173.04535, 13.25069),
(217.16403, -5.267879),
(223.26208, -12.272443),
(236.18706, -0.6797693),
(245.17982, -37.288593),
(-13.084919, 72.95583),
(-41.46973, 184.87607),
(12.04805, 204.12996),
(99.46122, 94.448265),
(118.5388, 91.06161),
(133.07253, 87.40959),
(177.77507, 212.54617),
(144.97702, 183.03534),
(156.09476, 214.75204),
(128.86328, 219.4853),
(132.17805, 234.97064),
(137.11694, 258.63983),
(163.70282, 243.12799),
(64.91539, 191.43927),
(-12.842681, 143.87068),
(29.81351, 114.216156),
(-73.84405, 54.859352),
(-23.803596, 37.90941),
(-112.69174, 40.065697),
(-145.69702, 96.66771),
(-74.727875, 174.6331),
(-50.793102, 157.55267),
(-46.392937, 102.858315),
(-68.928986, 113.5682),
(-162.1242, 106.93634),
(-172.24219, 94.20292),
(-156.28598, 74.454094),
(-168.63016, 62.898834),
(-186.03537, 72.769066),
(-120.79868, -13.287231),
(-88.90755, 140.68242),
(16.756746, 6.9720583),
(-73.282875, 104.65321),
(-88.270584, 46.51388),
(-142.86032, 23.573168),
(-181.35385, 11.03698),
(-160.1698, -27.681433),
(-229.71715, 44.374554),
(-4.163196, -108.50927),
(-129.23668, -54.002045),
(-101.95163, -11.284678),
(-115.90303, -50.15605),
(-155.48552, -85.01231),
(-185.35472, -89.04662),
(-163.39464, -40.94129),
(-50.799324, -44.46471),
(-108.61604, -107.43704),
(-28.525124, -158.26965),
(28.674181, -121.59264),
(67.63483, -193.04265),
(66.37474, -229.12094),
(33.059147, -222.39722),
(14.857858, -176.49887),
(59.93704, -151.69302),
(84.8761, -153.27429),
(116.65664, -160.03963),
(123.67123, -124.00313),
(-15.581068, -96.50829),
(80.91282, 68.19816),
(96.511284, 32.854904),
(113.5697, 61.97621),
(118.66266, 25.84054),
(20.403845, 37.69441),
(57.23167, -49.156345),
(66.057846, -55.0896),
(103.521935, 52.258286),
(104.40275, -97.406395)
]
);
}
#[test]
fn test_barnes_hut_parallel() {
let data = les_miserables(true);
let settings = FA2Settings::from_graph_order(data.order())
.with_barnes_hut()
.parallel(true);
let mut layout = settings.build(data);
layout.run(10);
assert_eq!(
layout.data().positions().collect::<Vec<_>>(),
[
(192.00893, 14.105528),
(202.7492, 17.193209),
(196.67723, 29.25047),
(194.66754, 46.317287),
(168.70006, 61.13224),
(173.04501, 13.251018),
(217.16353, -5.2676387),
(223.26167, -12.272198),
(236.18681, -0.679338),
(245.1796, -37.288277),
(-13.082912, 72.95662),
(-41.472008, 184.87823),
(12.047463, 204.13115),
(99.45799, 94.4509),
(118.53269, 91.064445),
(133.08003, 87.40845),
(177.77075, 212.56197),
(144.98149, 183.03746),
(156.0903, 214.74994),
(128.83228, 219.4474),
(132.17444, 234.97472),
(137.11073, 258.65173),
(163.6939, 243.13045),
(64.91483, 191.44154),
(-12.845165, 143.87312),
(29.809868, 114.22325),
(-73.845505, 54.856213),
(-23.802853, 37.907722),
(-112.69171, 40.06347),
(-145.69621, 96.6693),
(-74.73032, 174.63069),
(-50.796165, 157.55281),
(-46.392414, 102.852776),
(-68.93025, 113.56582),
(-162.13153, 106.921104),
(-172.23778, 94.2012),
(-156.28694, 74.45438),
(-168.63062, 62.89824),
(-186.03752, 72.77018),
(-120.79883, -13.286243),
(-88.914894, 140.67276),
(16.75848, 6.974494),
(-73.2856, 104.65232),
(-88.27085, 46.511612),
(-142.85957, 23.572409),
(-181.35234, 11.038208),
(-160.17007, -27.681824),
(-229.71751, 44.37324),
(-4.161928, -108.50937),
(-129.23354, -54.00851),
(-101.95136, -11.284818),
(-115.90463, -50.146473),
(-155.48549, -85.01146),
(-185.3518, -89.0441),
(-163.39415, -40.941254),
(-50.796467, -44.46302),
(-108.61502, -107.436615),
(-28.524235, -158.26962),
(28.674656, -121.59245),
(67.63514, -193.04248),
(66.37392, -229.1157),
(33.060616, -222.39539),
(14.859171, -176.49812),
(59.937332, -151.692),
(84.876495, -153.27414),
(116.65734, -160.04039),
(123.671455, -124.002914),
(-15.580213, -96.50948),
(80.949684, 68.054474),
(96.50878, 32.861023),
(113.56877, 61.977043),
(118.66093, 25.840956),
(20.404526, 37.694923),
(57.232136, -49.155838),
(66.05819, -55.089516),
(103.520874, 52.26004),
(104.402885, -97.40593)
]
);
}