tests/testthat/test-metric-helpers.R

# -------------------------------------------------
# adj_confusion tests
# -------------------------------------------------

test_that("adj_confusion returns perfect confusion for identical graphs", {
  true <- make_amat(3, list(c(1, 2), c(2, 1), c(2, 3), c(3, 2)))
  est <- true

  res <- adj_confusion(est, true)

  expect_equal(res$fp, 0)
  expect_equal(res$fn, 0)
  expect_gt(res$tp, 0)
})

test_that("adj_confusion detects missing adjacency as false negatives", {
  true <- make_amat(3, list(c(1, 2), c(2, 1)))
  est <- make_amat(3, list()) # empty graph

  res <- adj_confusion(est, true)

  expect_equal(res$tp, 0)
  expect_equal(res$fp, 0)
  expect_gt(res$fn, 0)
})

test_that("adj_confusion detects extra adjacency as false positives", {
  true <- make_amat(3, list())
  est <- make_amat(3, list(c(1, 2), c(2, 1)))

  res <- adj_confusion(est, true)

  expect_equal(res$tp, 0)
  expect_equal(res$fn, 0)
  expect_gt(res$fp, 0)
})

# -------------------------------------------------
# dir_confusion tests
# -------------------------------------------------

test_that("dir_confusion gives perfect scores for identical directed graphs", {
  true <- make_amat(3, list(c(1, 2), c(2, 3)))
  est <- true

  res <- dir_confusion(est, true)

  expect_equal(res$fp, 0)
  expect_equal(res$fn, 0)
  expect_gt(res$tp, 0)
})

test_that("dir_confusion penalizes reversed directions", {
  true <- make_amat(2, list(c(1, 2)))
  est <- make_amat(2, list(c(2, 1)))

  res <- dir_confusion(est, true)

  expect_equal(res$tp, 0)
  expect_gt(res$fp, 0)
  expect_gt(res$fn, 0)
})

test_that("dir_confusion penalizes undirected when direction is required", {
  true <- make_amat(2, list(c(1, 2)))
  est <- make_amat(2, list(c(1, 2), c(2, 1))) # undirected

  res <- dir_confusion(est, true)

  expect_equal(res$tp, 0)
  expect_equal(res$fp, 0)
  expect_gt(res$fn, 0)
})

test_that("dir_confusion penalizes directed when edge should be undirected", {
  true <- make_amat(2, list(c(1, 2), c(2, 1))) # undirected
  est <- make_amat(2, list(c(1, 2))) # directed

  res <- dir_confusion(est, true)

  expect_equal(res$tp, 0)
  expect_gt(res$fp, 0)
})

test_that("dir_confusion ignores non-adjacent edges", {
  true <- make_amat(3, list(c(1, 2)))
  est <- make_amat(3, list(c(2, 3)))

  res <- dir_confusion(est, true)

  expect_equal(res$tp, 0)
  expect_equal(res$fp, 0)
  expect_equal(res$fn, 0)
})

Try the causalDisco package in your browser

Any scripts or data that you put into this service are public.

causalDisco documentation built on April 13, 2026, 5:06 p.m.