#  File tests/testthat/test-basis.R in package ergm, part of the
#  Statnet suite of packages for network analysis, https://statnet.org .
#
#  This software is distributed under the GPL-3 license.  It is free,
#  open source, and has the attribution requirements (GPL Section 7) at
#  https://statnet.org/attribution .
#
#  Copyright 2003-2025 Statnet Commons
################################################################################

test_that("basis works as expected", {
  set.seed(0)
  nw <- network(100, directed = FALSE)
  nw %v% "attr" <- rep(1:2, length.out = 100)
  nw2 <- network(100, directed = FALSE)
  nw2 %v% "attr" <- rep(1:2, length.out = 100)
  set.seed(0)
  e <- ergm(nw ~ edges + degree(1) + nodematch("attr"))
  set.seed(0)
  e2 <- ergm(~edges + degree(1) + nodematch("attr"), basis = nw)
  set.seed(0)
  e3 <- ergm(nw2 ~ edges + degree(1) + nodematch("attr"), basis = nw)
  expect_equal(coef(e), coef(e2))
  expect_equal(coef(e2), coef(e3))
  expect_equal(logLik(e), logLik(e2))
  expect_equal(logLik(e2), logLik(e3))
})

test_that("basis works as expected with dyad-dependent constraints", {
  old.opts <- options(ergm.loglik.warn_dyads = FALSE)
  set.seed(0)
  nw <- network.initialize(100, directed = FALSE)
  nw %v% "attr" <- rep(1:2, length.out = 100)
  nw2 <- network.initialize(100, directed = FALSE)
  nw2 %v% "attr" <- rep(1:2, length.out = 100)
  nw <- san(nw ~ edges, target.stats = c(75), constraints = ~bd(maxout = 3))
  nw2 <- san(nw2 ~ edges, target.stats = c(100), constraints = ~bd(maxout = 3))
  set.seed(0)
  e <- ergm(nw ~ edges + degree(1) + nodematch("attr"), constraints = ~bd(maxout = 3))
  set.seed(0)
  e2 <- ergm(~edges + degree(1) + nodematch("attr"), basis = nw, constraints = ~bd(maxout = 3))
  set.seed(0)
  e3 <- ergm(nw2 ~ edges + degree(1) + nodematch("attr"), basis = nw, constraints = ~bd(maxout = 3))
  expect_equal(coef(e), coef(e2))
  expect_equal(coef(e2), coef(e3))
  expect_equal(logLik(e), logLik(e2))
  expect_equal(logLik(e2), logLik(e3))
  options(old.opts)
})
