@@ -26,11 +26,11 @@ Evaluate::~Evaluate()
2626 * @param the trial vector, the problem definition, and the mined association rule.
2727 * @return double return code: the calculated fitness value.
2828 */
29- double Evaluate::EnergyFunction (vector<double > x, Problem prob, Rule &rule)
29+ double Evaluate::EnergyFunction (vector<double > x, Problem prob, Rule &rule, int intervals )
3030{
3131 double result = 0 ;
3232
33- decode (x, prob.feat , rule);
33+ decode (x, prob.feat , rule, intervals );
3434
3535 if (rule.isValid ()) {
3636 rule.set_support (prob.calc_support (rule));
@@ -72,7 +72,7 @@ int Evaluate::encode(int D, Problem prob)
7272 * @param the real-valued vector, the list of features, and the mined association rule.
7373 * @return no return code.
7474 */
75- void Evaluate::decode (vector<double > x, vector<Feature> feat, Rule &rule)
75+ void Evaluate::decode (vector<double > x, vector<Feature> feat, Rule &rule, int intervals )
7676{
7777 for (uint i=0 ;i<pointers.size ();i++) {
7878 rule.init (i, x[pointers[i]]);
@@ -89,7 +89,9 @@ void Evaluate::decode(vector<double> x, vector<Feature> feat, Rule &rule)
8989 bool taken = false ;
9090 int ptr = pointers[rule.perm [i]];
9191 string pair = feat[rule.perm [i]].f_name +" _" ;
92+ // cout << pair << ": Type= ";
9293 if (feat[rule.perm [i]].type == ATTR_CATEGORICAL) { // categorical attribute
94+ // cout << "CATEGORICAL" << endl;
9395 if (random01 () < x[ptr+2 ]) {
9496 uint val = x[ptr+1 ]*feat[rule.perm [i]].hash .size ();
9597 if (val == feat[rule.perm [i]].hash .size ()) // fixed at 2.10.2020 by Fister Iztok
@@ -98,36 +100,71 @@ void Evaluate::decode(vector<double> x, vector<Feature> feat, Rule &rule)
98100 taken = true ;
99101 }
100102 } else if (feat[rule.perm [i]].type == ATTR_NUMERICAL) { // numerical attribute
103+ // cout << "NUMERICAL" << endl;
101104 if (random01 () < x[ptr + 3 ]) {
102105 int a, b;
106+ int Delta = feat[rule.perm [i]].i_num .upper - feat[rule.perm [i]].i_num .lower ;
107+ // cout << "Delta= " << Delta << ", intervals= " << intervals;
108+ int delta = 0 ;
109+ if (intervals > 1 )
110+ delta = Delta/intervals;
111+ // cout << ", delta= " << delta << endl;
112+ // decoding
103113 if (x[ptr + 1 ] > x[ptr + 2 ]) {
104- a = (feat[rule. perm [i]]. i_num . upper - feat[rule. perm [i]]. i_num . lower ) * x[ptr + 2 ] + feat[rule.perm [i]].i_num .lower ;
105- b = (feat[rule. perm [i]]. i_num . upper - feat[rule. perm [i]]. i_num . lower ) * x[ptr + 1 ] + feat[rule.perm [i]].i_num .lower ;
114+ a = Delta * x[ptr + 2 ] + feat[rule.perm [i]].i_num .lower ;
115+ b = Delta * x[ptr + 1 ] + feat[rule.perm [i]].i_num .lower ;
106116 } else {
107- a = (feat[rule. perm [i]]. i_num . upper - feat[rule. perm [i]]. i_num . lower ) * x[ptr + 1 ] + feat[rule.perm [i]].i_num .lower ;
108- b = (feat[rule. perm [i]]. i_num . upper - feat[rule. perm [i]]. i_num . lower ) * x[ptr + 2 ] + feat[rule.perm [i]].i_num .lower ;
117+ a = Delta * x[ptr + 1 ] + feat[rule.perm [i]].i_num .lower ;
118+ b = Delta * x[ptr + 2 ] + feat[rule.perm [i]].i_num .lower ;
109119 }
120+ // repairing
121+ if ((delta >= 0 ) && ((b-a) > delta)) {
122+ // cout << "Repairing NUMERICAL: [" << a << "," << b << "] ==> ";
123+ b = a + delta;
124+ // cout << "[" << a << "," << b << "]." << endl;
125+ } else {
126+ // cout << "NO repairing NUMERICAL: [" << a << "," << b << "]." << endl;
127+ }
128+ // proceed
110129 char str_pom[256 ];
111130 sprintf (str_pom, " %d_%d" , a, b);
112131 string attr (str_pom);
113132 pair.append (attr);
114133 taken = true ;
115134 }
116135 } else {
136+ // cout << "FLOATING-POINT" << endl;
117137 if (random01 () < x[ptr + 3 ]) {
118138 double a, b;
139+ double Delta = feat[rule.perm [i]].f_num .upper - feat[rule.perm [i]].f_num .lower ;
140+ // cout << "Delta= " << Delta << ", intervals= " << intervals;
141+ double delta = 0 ;
142+ if (intervals > 1 )
143+ delta = Delta/(double ) intervals;
144+ // cout << ", delta= " << delta << endl;
145+ // decoding
119146 if (x[ptr + 1 ] > x[ptr + 2 ]) {
120- a = (feat[rule.perm [i]].f_num .upper - feat[rule.perm [i]].f_num .lower ) * x[ptr + 2 ] + feat[rule.perm [i]].f_num .lower ;
121- b = (feat[rule.perm [i]].f_num .upper - feat[rule.perm [i]].f_num .lower ) * x[ptr + 1 ] + feat[rule.perm [i]].f_num .lower ;
147+ a = Delta * x[ptr + 2 ] + feat[rule.perm [i]].f_num .lower ;
148+ b = Delta * x[ptr + 1 ] + feat[rule.perm [i]].f_num .lower ;
149+ } else {
150+ a = Delta * x[ptr + 1 ] + feat[rule.perm [i]].f_num .lower ;
151+ b = Delta * x[ptr + 2 ] + feat[rule.perm [i]].f_num .lower ;
152+ }
153+ // repairing
154+ if ((delta >= 0 ) && ((b-a) > delta)) {
155+ // cout << "Repairing REAL: [" << a << "," << b << "] ==> ";
156+ b = a + delta;
157+ // cout << "[" << a << "," << b << "]." << endl;
122158 } else {
123- a = (feat[rule.perm [i]].f_num .upper - feat[rule.perm [i]].f_num .lower ) * x[ptr + 1 ] + feat[rule.perm [i]].f_num .lower ;
124- b = (feat[rule.perm [i]].f_num .upper - feat[rule.perm [i]].f_num .lower ) * x[ptr + 2 ] + feat[rule.perm [i]].f_num .lower ;
159+ // cout << "NO repairing REAL: [" << a << "," << b << "]." << endl;
125160 }
161+ // proceed
126162 char str_pom[256 ];
127163 sprintf (str_pom, " %.4f_%.4f" , a, b);
128164 string attr (str_pom);
129165 pair.append (attr);
130166 taken = true ;
167+ // cout << "Feature= " << pair << endl;
131168 }
132169 }
133170 if (taken) {
@@ -140,6 +177,7 @@ void Evaluate::decode(vector<double> x, vector<Feature> feat, Rule &rule)
140177 }
141178 }
142179 }
180+ // exit(-1);
143181}
144182
145183void Evaluate::print_vec (string str, vector<int >vec)
0 commit comments