use graph::prelude::*;
use log::info;
use polars::prelude::*;
type AppResult = Result<(), Box<dyn std::error::Error>>;
type ID = u64;
fn main() -> AppResult {
env_logger::init();
let g: DirectedCsrGraph<ID> = GraphBuilder::new()
.csr_layout(CsrLayout::Deduplicated)
.file_format(Graph500Input::default())
.path("examples/scale_24.graph")
.build()?;
let (scores, iterations, _) = time(|| page_rank(&g, PageRankConfig::default()));
info!("PageRank ran iterations: {iterations}");
let df = DataFrame::new(vec![Series::new("scores", scores)])?;
info!("size = {}", df.height());
info!("min = {}", df.min());
info!("max = {}", df.max());
info!("mean = {}", df.mean());
info!("median = {}", df.median());
let components = time(|| wcc_afforest(&g, WccConfig::default())).to_vec();
let df = DataFrame::new(vec![Series::new("components", components)])?;
info!("size = {}", df.height());
let df = df.unique(None, UniqueKeepStrategy::First)?;
info!("component count = {}", df.height());
let mut ug = time(|| g.to_undirected(CsrLayout::Deduplicated));
drop(g);
time(|| ug.make_degree_ordered());
let tc = time(|| global_triangle_count(&ug));
info!("TC: found {tc} triangles.");
Ok(())
}
fn time<T, F: FnOnce() -> T>(f: F) -> T {
let start = std::time::Instant::now();
let res = f();
info!("Execution took {:?}", start.elapsed());
res
}