/***********************************************************************
This file is part of KEEL-software, the Data Mining tool for regression,
classification, clustering, pattern mining and so on.
Copyright (C) 2004-2010
F. Herrera (herrera@decsai.ugr.es)
L. S�nchez (luciano@uniovi.es)
J. Alcal�-Fdez (jalcala@decsai.ugr.es)
S. Garc�a (sglopez@ujaen.es)
A. Fern�ndez (alberto.fernandez@ujaen.es)
J. Luengo (julianlm@decsai.ugr.es)
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see http://www.gnu.org/licenses/
**********************************************************************/
package keel.Algorithms.Genetic_Rule_Learning.BioHEL;
import org.core.Randomize;
import keel.Dataset.Instance;
public class instanceSet {
windowing win;
Sampling[] initSamplings;
int numInstancesOrig;
boolean windowingEnabled;
int[] countsByClass;
int[][] instByClass;
int numClasses;
boolean classWiseInit;
Instance[] set;
Instance[] origSet;
Instance[] window;
int windowSize;
public instanceSet(int traintest){
set = new Instance[Parameters.NumInstances];
for(int i=0;i<Parameters.NumInstances;i++) {
set[i] = new Instance(Parameters.instances[i]);
}
// ---------------
int i;
window=null;
win=null;
origSet = new Instance [Parameters.NumInstances];
numInstancesOrig=Parameters.NumInstances;
for(i=0;i<Parameters.NumInstances;i++) {
origSet[i]=set[i];
}
initializeWindowing(traintest);
if(traintest==Parameters.TRAIN) {
numClasses=Parameters.numClasses;
classWiseInit = Parameters.classWiseInit;
initInstanceLists();
} else {
initSamplings=null;
countsByClass=null;
instByClass=null;
}
}
public int getCurrentVersion(){
if(Parameters.windowingMethod != Parameters.NONE) return win.getCurrentVersion();
return 0;
}
public void restart(){
initInstanceLists();
initializeWindowing(Parameters.TRAIN);
}
public void initInstanceLists(){
int i;
int numInst=getNumInstances();
countsByClass = new int[numClasses];
initSamplings = new Sampling [numClasses];
instByClass = new int [numClasses][];
for(i=0;i<numClasses;i++) {
countsByClass[i]=0;
}
for(i=0;i<numInst;i++) {
int cl=set[i].getOutputNominalValuesInt(0);
countsByClass[cl]++;
}
for(i=0;i<numClasses;i++) {
int num=countsByClass[i];
initSamplings[i] = new Sampling(num);
instByClass[i] = new int[num];
countsByClass[i]=0;
}
for(i=0;i<numInst;i++) {
int cl=set[i].getOutputNominalValuesInt(0);
instByClass[cl][countsByClass[cl]++]=i;
}
}
public int getNumInstances(){return Parameters.NumInstances;}
public void initializeWindowing(int traintest)
{
if(traintest == Parameters.TRAIN){
if(Parameters.windowingMethod == Parameters.ILAS) {
windowingEnabled=true;
if(win==null) win=new windowingILAS();
} else if(Parameters.windowingMethod == Parameters.GWS) {
windowingEnabled=true;
if(win==null) win=new windowingGWS();
} else {
windowingEnabled=false;
window=null;
}
if(windowingEnabled) {
win.setInstances(set,Parameters.NumInstances);
Object[] reso = win.newIteration();
windowSize = (Integer) reso[0];
window = (Instance[]) reso[1];
}
} else {
windowingEnabled=false;
window=null;
}
}
public Instance getInstance(int index) {
if(windowingEnabled) return window[index];
return set[index];
}
public Instance[] getInstancesOfIteration() {
if(windowingEnabled) return window;
return set;
}
public Instance[] getAllInstances() {
return set;
}
public Instance[] getOrigInstances() {
return origSet;
}
public int getNumInstancesOrig() {
return numInstancesOrig;
}
public boolean isWindowingEnabled() {return (Parameters.windowingMethod != Parameters.NONE);}
int numVersions(){
if(windowingEnabled) return win.numVersions();
return 1;
}
public int getNumInstancesOfIteration(){
if(windowingEnabled) return windowSize;
return Parameters.NumInstances;
}
public boolean newIteration(boolean isLast){
if(isLast) {
windowingEnabled=false;
return true;
}
if(Parameters.windowingMethod != Parameters.NONE) {
Object[] reso = win.newIteration();
windowSize = (Integer) reso[0];
window = (Instance[]) reso[1];
if(win.needReEval()) return true;
return false;
}
return false;
}
public Instance getInstanceInit(int forbiddenCL){
if(classWiseInit) {
if(forbiddenCL!=numClasses) {
boolean allEmpty=true;
int i;
for(i=0;i<numClasses;i++) {
if(i==forbiddenCL) continue;
if(countsByClass[i]>0) {
allEmpty=false;
break;
}
}
if(allEmpty) {
return null;
}
}
int cl;
do {
if(forbiddenCL!=numClasses) {
cl=Randomize.Randint(0,numClasses-1);
if(cl>=forbiddenCL) cl++;
} else {
cl=Randomize.Randint(0,numClasses);
}
} while(countsByClass[cl]==0);
int pos=initSamplings[cl].getSample();
int insIndex=instByClass[cl][pos];
Instance ins=set[insIndex];
return ins;
} else {
int nc = numClasses;
int[] count = new int[nc];
int total=0;
int i;
if(forbiddenCL != numClasses) nc--;
for(i=0;i<nc;i++) {
if(i<forbiddenCL)
count[i]=initSamplings[i].numSamplesLeft();
else
count[i]=initSamplings[i+1].numSamplesLeft();
total+=count[i];
}
// esto es para cuando no quedan instancias de clases que no sean por defecto
if(total == 0) return null;
int pos=Randomize.Randint(0,total);
int acum=0;
boolean found=false;
for(i=0;i<nc && !found;i++) {
acum+=count[i];
if(pos<acum) {
found=true;
}
}
i--;
if(i>=forbiddenCL) i++;
pos=initSamplings[i].getSample();
int insIndex=instByClass[i][pos];
Instance ins = set[insIndex];
return ins;
}
}
public void removeInstancesAndRestart(classifier cla){
int i;
int numRemoved=0;
int index=0;
int[] countClassRem = new int[numClasses];
for(i=0;i<numClasses;i++) {
countClassRem[i]=0;
}
int numOrig = Parameters.NumInstances;
while(index<Parameters.NumInstances) {
if(cla.doMatch(set[index])) {
set[index]=set[Parameters.NumInstances-1];
numRemoved++;
Parameters.NumInstances--;
} else {
countClassRem[set[index].getOutputNominalValuesInt(0)]++;
index++;
}
}
initInstanceLists();
initializeWindowing(Parameters.TRAIN);
}
}