Detect which rules cause infeasibility. This methods tries to remove the minimum number of rules to make the system mathematically feasible. Note that this may not result in your desired system, because some rules may be more important to you than others. This can be mitigated by supplying weights for the rules. Default weight is 1.

detect_infeasible_rules(x, weight = numeric(), ..., verbose = interactive())

Arguments

x

validate::validator() object with rules

weight

optional named numeric() with weights. Unnamed variables in the weight are given the default weight 1.

...

not used

verbose

if TRUE it prints the infeasible rules that have been found.

Value

character with the names of the rules that are causing infeasibility.

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"