Make an infeasible system feasible, by removing the minimum (weighted) number of rules, such that the remaining
rules are not conflicting.
This function uses detect_infeasible_rules()
for determining the rules to be removed.
Note that this may not result in your desired system, because some rules may be more important.
This can be mediated by supplying weights for the rules. Default weight is 1.
make_feasible(x, ..., verbose = interactive())
validate::validator()
object with the validation rules.
passed to detect_infeasible_rules()
if TRUE
print information to the console
validate::validator()
object with feasible rules.
Also make_feasible()
does not check for contradictions in if
rules, so it is wise to also check
detect_contradicting_if_rules()
after making the system feasible.
Other feasibility:
detect_boundary_cat()
,
detect_boundary_num()
,
detect_contradicting_if_rules()
,
detect_infeasible_rules()
,
is_contradicted_by()
,
is_infeasible()
rules <- validator( x > 0)
is_infeasible(rules)
#> [1] FALSE
# infeasible system!
rules <- validator( rule1 = x > 0
, rule2 = x < 0
)
is_infeasible(rules)
#> [1] TRUE
detect_infeasible_rules(rules, verbose=TRUE)
#> Found:
#> rule1: x > 0
#> [1] "rule1"
# but we want to keep rule1, so specify that it has an Inf weight
detect_infeasible_rules(rules, weight=c(rule1=Inf), verbose=TRUE)
#> Found:
#> rule2: x < 0
#> [1] "rule2"
# detect and remove
make_feasible(rules, weight=c(rule1=Inf), verbose = TRUE)
#> Found:
#> rule2: x < 0
#> Dropping rule(s): "rule2"
#> Object of class 'validator' with 1 elements:
#> rule1: x > 0
#> Rules are evaluated using locally defined options
# find out the conflict with rule2
is_contradicted_by(rules, "rule2", verbose = TRUE)
#> Rule(s):
#> rule2: x < 0
#> contradicted by:
#> rule1: x > 0
#> [1] "rule1"