forked from mlr-org/bbotk
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathassertions.R
105 lines (94 loc) · 3.15 KB
/
assertions.R
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
#' @title Assertion for bbotk objects
#'
#' @description
#' Most assertion functions ensure the right class attribute, and optionally
#' additional properties. Additionally, the following compound assertions are
#' implemented:
#'
#' * `assert_terminable(terminator, instance)`\cr
#' ([Terminator], [OptimInstance]) -> `NULL`\cr
#' Checks if the terminator is applicable to the optimization.
#'
#' * `assert_instance_properties(optimizer, instance)`\cr
#' ([Optimizer], [OptimInstance]) -> `NULL`\cr
#' Checks if the instance is applicable to the optimizer.
#'
#' If an assertion fails, an exception is raised. Otherwise, the input object is
#' returned invisibly.
#'
#' @name bbotk_assertions
#' @keywords internal
NULL
#' @export
#' @param terminator ([Terminator]).
#' @param instance ([OptimInstance]).
#' @rdname bbotk_assertions
assert_terminator = function(terminator, instance = NULL) {
assert_r6(terminator, "Terminator")
if (!is.null(instance)) {
assert_terminable(terminator, instance)
}
invisible(terminator)
}
#' @export
#' @param terminator ([Terminator]).
#' @param instance ([OptimInstance]).
#' @rdname bbotk_assertions
assert_terminable = function(terminator, instance) {
if ("OptimInstanceMultiCrit" %in% class(instance)) {
if (!"multi-crit" %in% terminator$properties) {
stopf("Terminator '%s' does not support multi-crit optimization",
terminator$format())
}
} else {
if (!"single-crit" %in% terminator$properties) {
stopf("Terminator '%s' does not support single-crit optimization",
terminator$format())
}
}
}
#' @export
#' @param x (any)
#' @param empty (`logical(1)`)
#' @param .var.name (`character(1)`)
#' @rdname bbotk_assertions
assert_set = function(x, empty = TRUE, .var.name = vname(x)) {
assert_character(x, min.len = as.integer(!empty), any.missing = FALSE,
min.chars = 1L, unique = TRUE, .var.name = .var.name)
}
#' @export
#' @param optimizer ([Optimizer])
#' @rdname bbotk_assertions
assert_optimizer = function(optimizer) {
assert_r6(optimizer, "Optimizer")
}
#' @export
#' @param optimizer ([Optimizer]).
#' @param instance ([OptimInstance]).
#' @rdname bbotk_assertions
assert_instance_properties = function(optimizer, inst) {
assert_r6(inst, "OptimInstance")
require_namespaces(optimizer$packages)
# check multi or single-crit
if ("multi-crit" %nin% optimizer$properties && inst$objective$ydim > 1) {
stopf(
"'%s' does not support multi-crit objectives",
optimizer$format())
}
if ("single-crit" %nin% optimizer$properties && inst$objective$ydim == 1) {
stopf(
"'%s' does not support single-crit objectives",
optimizer$format())
}
# check dependencies
if ("dependencies" %nin% optimizer$properties && inst$search_space$has_deps) {
stopf(
"'%s' does not support param sets with dependencies!",
optimizer$format())
}
# check supported parameter class
not_supported_pclasses = setdiff(unique(inst$search_space$class), get_private(optimizer)$.param_classes)
if (length(not_supported_pclasses) > 0L) {
stopf("'%s' does not support param types: '%s'", class(optimizer)[1L], paste0(not_supported_pclasses, collapse = ","))
}
}