'Following an unordered set of rules, for each instance, all
rules are tried and those that fire are collected. If a clash
occurs, class probabilities (predictions) of all collected rules
are summed and weighted.
Notes
If no other rules fire, the default rule prediction is used.
Any other empty rules (a fallout most common in the domain of
weighted covering algorithms) are ignored.
Parameters
X : ndarray
Classify this data.
Returns
res : ndarray, float
Probabilistic classification.'

def unordered_predict(self, X):

    num_classes = len(self.domain.class_var.values)
    probabilities = np.array([np.zeros(num_classes, dtype=float) for _ in range(X.shape[0])])
    num_hits = np.zeros(X.shape[0], dtype=int)
    total_weight = np.vstack(np.zeros(X.shape[0], dtype=float))
    for rule in self.rule_list[:(-1)]:
        if (rule.length > 0):
            curr_covered = rule.evaluate_data(X)
            num_hits += curr_covered
            temp = rule.curr_class_dist.sum()
            probabilities[curr_covered] += (rule.probabilities * temp)
            total_weight[curr_covered] += temp
    default_rule = self.rule_list[(-1)]
    weigh_down = (num_hits > 0)
    apply_default = (num_hits == 0)
    probabilities[weigh_down] /= total_weight[weigh_down]
    probabilities[apply_default] = default_rule.probabilities
    return probabilities
