@@ -44,6 +44,8 @@ public class ClassificationFinder extends AbstractFinder {
44
44
45
45
protected Map <Attribute , Map <Double , IntegerBitSet >> precalculatedCoveringsComplement ;
46
46
47
+ protected Map <Attribute , Integer []> attributeValuesOrder ;
48
+
47
49
/**
48
50
* Initializes induction parameters.
49
51
* @param params Induction parameters.
@@ -66,6 +68,7 @@ public ExampleSet preprocess(ExampleSet trainSet) {
66
68
return trainSet ;
67
69
}
68
70
71
+ attributeValuesOrder = new HashMap <Attribute , Integer []>();
69
72
precalculatedCoverings = new HashMap <Attribute , Map <Double , IntegerBitSet >>();
70
73
precalculatedCoveringsComplement = new HashMap <Attribute , Map <Double , IntegerBitSet >>();
71
74
Attributes attributes = trainSet .getAttributes ();
@@ -78,9 +81,19 @@ public ExampleSet preprocess(ExampleSet trainSet) {
78
81
Future f = pool .submit ( () -> {
79
82
Map <Double , IntegerBitSet > attributeCovering = new TreeMap <Double , IntegerBitSet >();
80
83
Map <Double , IntegerBitSet > attributeCoveringComplement = new TreeMap <Double , IntegerBitSet >();
84
+ Integer [] valuesOrder = null ;
81
85
82
86
// check if attribute is nominal
83
87
if (attr .isNominal ()) {
88
+ // get orders
89
+ valuesOrder = new Integer [attr .getMapping ().size ()];
90
+ List <String > labels = new ArrayList <>();
91
+ labels .addAll (attr .getMapping ().getValues ());
92
+ Collections .sort (labels );
93
+ for (int j = 0 ; j < labels .size (); ++j ) {
94
+ valuesOrder [j ] = attr .getMapping ().getIndex (labels .get (j ));
95
+ }
96
+
84
97
// prepare bit vectors
85
98
for (int val = 0 ; val != attr .getMapping ().size (); ++val ) {
86
99
attributeCovering .put ((double ) val , new IntegerBitSet (trainSet .size ()));
@@ -108,6 +121,7 @@ public ExampleSet preprocess(ExampleSet trainSet) {
108
121
synchronized (this ) {
109
122
precalculatedCoverings .put (attr , attributeCovering );
110
123
precalculatedCoveringsComplement .put (attr , attributeCoveringComplement );
124
+ attributeValuesOrder .put (attr , valuesOrder );
111
125
}
112
126
});
113
127
@@ -664,9 +678,10 @@ class TotalPosNeg {
664
678
} else {
665
679
// unweighted case
666
680
// try all possible conditions
667
- for (int i = 0 ; i < attr .getMapping ().size (); ++i ) {
681
+ for (int j = 0 ; j < attr .getMapping ().size (); ++j ) {
668
682
669
683
// evaluate straight condition
684
+ int i = attributeValuesOrder .get (attr )[j ];
670
685
IntegerBitSet conditionCovered = precalculatedCoverings .get (attr ).get ((double ) i );
671
686
double p = conditionCovered .calculateIntersectionSize (rule .getCoveredPositives ());
672
687
int toCover_p = conditionCovered .calculateIntersectionSize ((IntegerBitSet ) coveredByRule , (IntegerBitSet ) uncoveredPositives );
0 commit comments