mod common;
use anyhow::Result;
use common::test_graph;
use dsi_bitstream::prelude::*;
use lender::*;
use sux::traits::IndexedSeq;
use webgraph::graphs::bvgraph::DCF;
use webgraph::prelude::*;
const EXPECTED_DCF: [usize; 9] = [0, 2, 5, 6, 7, 8, 10, 11, 11];
fn verify_dcf(dcf: &DCF, expected: &[usize]) {
assert_eq!(dcf.len(), expected.len());
for (i, &expected_val) in expected.iter().enumerate() {
assert_eq!(
dcf.get(i),
expected_val,
"DCF mismatch at index {i}: expected {expected_val}, got {}",
dcf.get(i),
);
}
}
#[test]
fn test_build_dcf_vec_graph() {
let graph = test_graph();
let dcf = graph.build_dcf();
verify_dcf(&dcf, &EXPECTED_DCF);
}
#[test]
fn test_build_dcf_bvgraph_seq() -> Result<()> {
let graph = test_graph();
let tmp = tempfile::NamedTempFile::new()?;
BvComp::with_basename(tmp.path()).comp_graph::<BE>(&graph)?;
let seq = BvGraphSeq::with_basename(tmp.path())
.endianness::<BE>()
.load()?;
let dcf = seq.build_dcf();
verify_dcf(&dcf, &EXPECTED_DCF);
Ok(())
}
#[test]
fn test_build_dcf_csr_graph() {
let graph = test_graph();
let csr = CsrGraph::from_seq_graph(&graph);
let dcf = csr.build_dcf();
verify_dcf(&dcf, &EXPECTED_DCF);
}
#[test]
fn test_build_dcf_csr_sorted_graph() {
let graph = test_graph();
let csr = CsrSortedGraph::from_seq_graph(&graph);
let dcf = csr.build_dcf();
verify_dcf(&dcf, &EXPECTED_DCF);
}
#[test]
fn test_build_dcf_cross_check() -> Result<()> {
let graph = test_graph();
let csr = CsrGraph::from_seq_graph(&graph);
let csr_sorted = CsrSortedGraph::from_seq_graph(&graph);
let tmp = tempfile::NamedTempFile::new()?;
BvComp::with_basename(tmp.path()).comp_graph::<BE>(&graph)?;
let bv_seq = BvGraphSeq::with_basename(tmp.path())
.endianness::<BE>()
.load()?;
let dcf_vec = graph.build_dcf();
let dcf_csr = csr.build_dcf();
let dcf_csr_sorted = csr_sorted.build_dcf();
let dcf_bv_seq = bv_seq.build_dcf();
for i in 0..EXPECTED_DCF.len() {
let v = dcf_vec.get(i);
assert_eq!(v, dcf_csr.get(i), "VecGraph vs CsrGraph at index {i}");
assert_eq!(
v,
dcf_csr_sorted.get(i),
"VecGraph vs CsrSortedGraph at index {i}"
);
assert_eq!(v, dcf_bv_seq.get(i), "VecGraph vs BvGraphSeq at index {i}");
}
Ok(())
}
#[test]
fn test_build_dcf_cnr_2000() -> Result<()> {
let seq = BvGraphSeq::with_basename("../data/cnr-2000")
.endianness::<BE>()
.load()?;
let n = seq.num_nodes();
let dcf = seq.build_dcf();
assert_eq!(dcf.len(), n + 1);
assert_eq!(dcf.get(0), 0);
let mut cumul = 0usize;
let mut node_idx = 0usize;
let mut lender = seq.iter();
while let Some((_node, succs)) = lender.next() {
cumul += succs.into_iter().count();
node_idx += 1;
assert_eq!(dcf.get(node_idx), cumul, "DCF mismatch at node {node_idx}");
}
assert_eq!(node_idx, n);
assert_eq!(cumul, seq.num_arcs_hint().unwrap() as usize);
Ok(())
}