tests/testthat/test-ConditionalARFSampler.R

# Tests for ConditionalARFSampler

test_that("ConditionalARFSampler initialization works", {
	skip_if_not_installed("arf")

	task = tgen("circle", d = 5)$generate(n = 100)
	sampler = ConditionalARFSampler$new(task)

	expect_s3_class(sampler, "ConditionalARFSampler")
	expect_s3_class(sampler, "ConditionalSampler")
	expect_equal(sampler$label, "Adversarial Random Forest sampler")
	expect_s3_class(sampler$param_set, "ParamSet")

	# Check expected parameters
	expected_params = c(
		"conditioning_set",
		"finite_bounds",
		"round",
		"stepsize",
		"verbose",
		"parallel"
	)
	expect_true(all(expected_params %in% sampler$param_set$ids()))

	# Check that ARF model was fitted
	expect_s3_class(sampler$arf_model, "ranger")
	expect_type(sampler$psi, "list")
})

test_that("ConditionalARFSampler sampling works", {
	skip_if_not_installed("arf")

	task = tgen("circle", d = 5)$generate(n = 100)
	sampler = ConditionalARFSampler$new(task)

	# Marginal sampling
	expect_marginal_sampling(sampler, feature = "x1", row_ids = 1:20)

	# Conditional sampling
	expect_conditional_sampling(
		sampler,
		feature = "x1",
		conditioning_set = c("x2", "x3"),
		row_ids = 1:20
	)

	# Multiple features
	expect_conditional_sampling(
		sampler,
		feature = c("x1", "x2"),
		conditioning_set = "x3",
		row_ids = 1:20
	)
})

test_that("ConditionalARFSampler handles empty conditioning set", {
	skip_if_not_installed("arf")

	task = tgen("circle", d = 5)$generate(n = 100)
	sampler = ConditionalARFSampler$new(task, conditioning_set = character(0))
	data = task$data()

	sampled = sampler$sample("x1")

	expect_sampler_output_structure(sampled, task, nrows = 100)

	# Sampled feature should differ from original
	expect_sampled_features_changed(sampled, data, "x1")

	# Non-sampled features should remain unchanged
	expect_non_sampled_unchanged(sampled, data, c("x2", "x3", "x4", "x5"))

	# Verify empty conditioning is stored
	expect_equal(sampler$param_set$values$conditioning_set, character(0))
})

test_that("ConditionalARFSampler works with different task types", {
	skip_if_not_installed("arf")

	# Regression task
	task_regr = tgen("circle", d = 4)$generate(n = 100)
	sampler_regr = ConditionalARFSampler$new(task_regr)
	expect_conditional_sampling(sampler_regr, "x1", "x2", row_ids = 1:20)

	# Binary classification task
	task_classif = tsk("sonar")
	sampler_classif = ConditionalARFSampler$new(task_classif)
	expect_conditional_sampling(sampler_classif, "V1", "V2", row_ids = 1:20)

	# Multiclass classification task
	task_multi = tsk("iris")
	sampler_multi = ConditionalARFSampler$new(task_multi)
	expect_conditional_sampling(sampler_multi, "Sepal.Length", "Sepal.Width", row_ids = 1:20)
})

test_that("ConditionalARFSampler param_set structure", {
	skip_if_not_installed("arf")

	task = tgen("circle", d = 5)$generate(n = 50)
	sampler = ConditionalARFSampler$new(task, finite_bounds = "no")

	# Check that removed/hardcoded parameters are not exposed
	hardcoded = c("evidence_row_mode", "sample_NAs", "nomatch", "n_synth")
	expect_false(any(hardcoded %in% sampler$param_set$ids()))

	# Check parameter types and defaults
	expect_equal(sampler$param_set$params[id == "finite_bounds"]$cls, "ParamFct")
	expect_equal(sampler$param_set$params[id == "finite_bounds"]$default[[1]], "no")
	expect_equal(sampler$param_set$params[id == "round"]$default[[1]], TRUE)
	expect_equal(sampler$param_set$params[id == "stepsize"]$default[[1]], 0)
	expect_equal(sampler$param_set$params[id == "verbose"]$default[[1]], FALSE)
	expect_equal(sampler$param_set$params[id == "parallel"]$default[[1]], FALSE)
})

test_that("ConditionalARFSampler parameter priority and storage", {
	skip_if_not_installed("arf")

	task = tgen("circle", d = 5)$generate(n = 50)
	sampler = ConditionalARFSampler$new(
		task,
		conditioning_set = "x2",
		verbose = FALSE,
		parallel = FALSE
	)

	# Stored parameters should be used
	sampled1 = sampler$sample("x1")
	expect_sampler_output_structure(sampled1, task, nrows = 50)

	# Override at call time
	sampled2 = sampler$sample("x1", verbose = TRUE)
	expect_sampler_output_structure(sampled2, task, nrows = 50)

	# Stored parameters remain unchanged
	expect_equal(sampler$param_set$values$verbose, FALSE)
	expect_equal(sampler$param_set$values$parallel, FALSE)
	expect_equal(sampler$param_set$values$conditioning_set, "x2")
})

test_that("ConditionalARFSampler conditioning_set parameter behavior", {
	skip_if_not_installed("arf")

	task = tgen("friedman1")$generate(n = 100)
	test_conditioning_set_behavior(ConditionalARFSampler, task, verbose = FALSE)
})

test_that("ConditionalARFSampler preserves feature types", {
	skip_if_not_installed("arf")
	test_sampler_feature_types(ConditionalARFSampler, verbose = FALSE)
})

Try the xplainfi package in your browser

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

xplainfi documentation built on Feb. 27, 2026, 1:08 a.m.