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())

Arguments

x

validate::validator() object with the validation rules.

...

passed to detect_infeasible_rules()

verbose

if TRUE print information to the console

Value

validate::validator() object with feasible rules.

Details

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.

Examples

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"