/***********************************************************************
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.LQD.methods.FGFS_Minimum_Risk;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Random;
import java.util.Vector;
/**
*
* File: Main.java
*
* Read the parameters given by the user.
* Read the training file
* Obtain the partitions
* Replace the missing values
* Convert imprecise data in crisp
*
*
* @author Written by Ana Palacios Jimenez (University of Oviedo) 25/006/2010
* @version 1.0
*/
public class Main {
/**
* @param args
* @throws IOException
*/
static float MISSING=-2;
public static void main(String[] args) throws IOException {
//Read the parameters of the method. This parameters are in one .txt
String parameters = args[0];
parameters par = new parameters(args[0]);
int cont=0;
while(cont<par.files)
{
String nentrada=par.original_data+cont+"tra.dat";//
System.out.println("\n Input File: "+nentrada);
int numlabels = par.partitions; //Number of partitions
int niteraciones=par.niterations; //number of iterations
int npoblacion=par.npoblation;//Size of poblation
float cross=par.cross;
float muta = par.muta;
//Creamos el fichero de entrada
File fe = new File(nentrada);
if(fe.exists()==false)
{
System.out.println("The file doesn`t exist");
System.exit(0);
}
BufferedReader input = new BufferedReader(new FileReader(nentrada));
Character character;
int dimx=par.dimx; //Number of variables
int ncol=dimx+1; //Number of columns in the input file
int instances=par.instances; //Number of instances
int nclasses = par.nclasses;
String amplitude=par.original_data+"Instances"+cont+".txt";//
File fea = new File(amplitude);
if(fea.exists()==true)
{
BufferedReader ampl = new BufferedReader(new FileReader(amplitude));
ampl.readLine();
instances=Integer.parseInt(ampl.readLine());
ampl.close();
}
//Save the values of each instances
fuzzy X[][] = new fuzzy[instances][dimx];
Vector<Vector<Float>> C= new Vector<Vector<Float>>(instances);//the output will be a set of elements
Vector<Float> W= new Vector<Float>(instances);//Cost of the instance when duplicate with crisp.
//In the imprecise data is always 1 for all the instances
Interval rangeX[]= new Interval[dimx];//the range of the variable (minimum and maximum)
for(int j=0; j<ncol-1; j++)
{
Interval nuevo= new Interval(-1,-1);
rangeX[j]= nuevo;
}
String number= "";
//Read the input file
int lines=1+dimx+4;
for(int i=0;i<lines;i++)
input.readLine();
//READ THE FILE
for(int i=0; i<instances; i++)
{
for(int j=0; j<ncol-1; j++)
{
character = (char)input.read();
if(character=='\n')
character = (char)input.read();
while(character!=']' && character!='\n' && character!='?')
{
number= number + character;
character = (char)input.read();
}
if(character==']' || character=='?')
{
number= number + character;
character = (char)input.read();//read ,
if(number.compareTo("?")==0)
{
fuzzy nuevo= new fuzzy();
nuevo.borrosotriangular(MISSING, MISSING, MISSING);
X[i][j]= nuevo;
}
else
{
X[i][j]=fun_aux.to_fuzzy(number);
//Found the range of the variable
if(i==0 || (rangeX[j].getmax()==-1 && rangeX[j].getmin()==-1))
{
Interval nuevo = new Interval(X[i][j].geta(),X[i][j].getd());
rangeX[j]=nuevo;
}
if(X[i][j].getd() > rangeX[j].getmax())
rangeX[j].setmax(X[i][j].getd());
if(X[i][j].geta() < rangeX[j].getmin())
rangeX[j].setmin(X[i][j].geta());
}
number="";
if(X[i][j].geta()>X[i][j].getd())
{
System.out.println("Incorrect values in the file: Values of the style [4,1]"+X[i][j].geta()+ " "+X[i][j].getd());
System.exit(0);
}
}
}
//Read the classes of the instance {1,..,x} (imprecise output)
character = (char)input.read();//read {
Vector <Float> salidas_imp= new Vector<Float>();
while(character!='}')
{
character = (char)input.read();//begin with a number
while(character!=',' && character!='}')
{
number= number + character;
character = (char)input.read();
}
salidas_imp.addElement(Float.parseFloat(number));
number="";
}
C.add(i,salidas_imp);
character = (char)input.read();
number="";
W.add(i,(float)1);
}//for read file
input.close();//cerramos el fichero
//Replace the missing values
X= Missing.values_missing(X,instances, dimx,1);
//Obtain the crisp version from imprecise data (if the user wants to work with crisp data)
String crisp=par.OutputName;
Vector<Vector<fuzzy>> X1 = new Vector<Vector<fuzzy>>();
Vector<Vector<Float>> C1= new Vector<Vector<Float>>();
Interval rangeX1[]= new Interval[dimx];
for(int j=0; j<ncol-1; j++)
{
Interval nuevo= new Interval(-1,-1);
rangeX1[j]= nuevo;
}
Vector<Float> P1= new Vector<Float>();
int es_crisp=0;
if(crisp.contains("Crisp"))
{
es_crisp=1;
for(int i=0;i<X.length;i++)
{
for(int j=0;j<X[i].length;j++)
{
X[i][j]=X[i][j].media();
if(i==0 || (rangeX[j].getmax()==-1 && rangeX[j].getmin()==-1))
{
Interval nuevo = new Interval(X[i][j].geta(),X[i][j].getd());
rangeX1[j]=nuevo;
}
if(X[i][j].getd() > rangeX1[j].getmax())
rangeX1[j].setmax(X[i][j].getd());
if(X[i][j].geta() < rangeX1[j].getmin())
rangeX1[j].setmin(X[i][j].geta());
}
}
//Duplicate the example with imprecise output
for(int i=0;i<C.size();i++)
{
if(C.get(i).size()>1)
{
for(int j=0;j<C.get(i).size();j++)
{
Vector<fuzzy> x2= new Vector<fuzzy>(dimx);
for(int v=0;v<X[i].length;v++)
{
x2.addElement(X[i][v]);
}
X1.addElement(x2);
Vector<Float> C2= new Vector<Float>();
C2.addElement(C.get(i).get(j));
C1.addElement(C2);
P1.addElement((float)1/C.get(i).size());
}
}
else
{
Vector<fuzzy> x2= new Vector<fuzzy>(dimx);
for(int v=0;v<X[i].length;v++)
{
x2.addElement(X[i][v]);
}
X1.addElement(x2);
Vector<Float> C2= new Vector<Float>();
C2.addElement(C.get(i).get(0));
C1.addElement(C2);
P1.addElement((float)1/C.get(i).size());
}
}
}
fuzzy[][] X2;
if(X1.size()!=0)
X2 = new fuzzy[X1.size()][X1.get(0).size()];
else
X2 = new fuzzy[1][1];
if(crisp.contains("Crisp"))
{
for(int i=0;i<X1.size();i++)
{
for(int j=0;j<X1.get(i).size();j++)
{
X2[i][j]=X1.get(i).get(j);
}
}
}
//Obtain the crisp and fuzzy variables
int[] fuzzy= new int[dimx+1]; //zero represents crisp and one represents fuzzy
fuzzy inputs[][];
if(es_crisp==1)
{
inputs= new fuzzy[X2.length][dimx];
inputs=X2;
}
else
{
inputs= new fuzzy[X.length][dimx];
inputs=X;
}
for(int i=0; i<inputs[0].length; i++)
{
boolean es_fuzzy=false;
for(int j=0; j<inputs.length; j++)
{
if(inputs[j][i].geta()!= inputs[j][i].getd())
es_fuzzy=true;
}
if(es_fuzzy==true)
fuzzy[i]=1;
}
fuzzy[fuzzy.length-1]=0;//is the class of the example
//Define the partitions
Vector<Integer> neparticion = new Vector<Integer>(dimx);
Vector<fuzzyPartition> particione = new Vector<fuzzyPartition>(dimx);
for(int i=0; i<fuzzy.length-1; i++)//The class is treated later
{
if(fuzzy[i]==1)//is fuzzy
{
neparticion.add(i, numlabels);
}
else
{
Vector <Float> variables = new Vector<Float>();
for(int k=0; k<inputs.length; k++)
{
if(k==0)
{
variables.addElement(inputs[k][i].geta());
}
else
{
boolean existe=false;
for(int h=0; h<variables.size();h++)
{
if(variables.get(h)==inputs[k][i].geta())
{
existe=true;
break;
}
}
if(existe==false)
{
variables.addElement(inputs[k][i].geta());
}
}
}// for
if(variables.size()>4 && par.partitions!=0)
{
neparticion.add(i,par.partitions);
}
else
neparticion.add(i, variables.size());
}// else crisp
fuzzyPartition particion;
if(es_crisp==1)
particion= new fuzzyPartition(rangeX1[i].getmin(),rangeX1[i].getmax(),neparticion.get(i));
else
particion= new fuzzyPartition(rangeX[i].getmin(),rangeX[i].getmax(),neparticion.get(i));
particione.add(i,particion);
particione.get(i).show();
}// for obtain partitions
//Variables used in the genetic algorithm
int costes=par.minimum_risk;
int reemplazar=par.reemplazo;
int alfa=par.alfa;
Vector<Float> values_classes= new Vector<Float>(nclasses);
values_classes = par.classes;
Vector<Vector<fuzzy>> cost= new Vector<Vector<fuzzy>>(nclasses);
String matrix= par.type_risk;
if(matrix.compareTo("I")==0)//cost matrix defined by interval
{
Vector<fuzzy> c;
int matrix_position=0;
for(int i=0;i<nclasses;i++)
{
c= new Vector<fuzzy>(nclasses);
for(int j=0;j<nclasses;j++)
{
fuzzy coste = new fuzzy();
float iz=par.costs.get(matrix_position);
matrix_position++;
float d=par.costs.get(matrix_position);
matrix_position++;
coste.borrosorectangular(iz, d);
c.add(j,coste);
}
cost.add(i,c);
}
} //if matrix I
else //cost matrix defined by linguistic terms
{
float distancia=(float)1/(float)((8*2)+(1*3));
Vector<fuzzy> c;
int position_cost=0;
for(int i=0;i<nclasses;i++)
{
c= new Vector<fuzzy>(nclasses);
for(int j=0;j<nclasses;j++)
{
float iz=0,ce=distancia,ce2=distancia*2,de=distancia*3;
float etiqueta=par.costs.get(position_cost);
System.out.println("The cost of the class "+i+" respect to "+j+" is "+etiqueta);
int conta=1;
if(etiqueta>0 && etiqueta<10)
{
while(conta<etiqueta)
{
iz=ce2;
ce=de;
ce2=de+distancia;
de=ce2+distancia;
conta++;
}
}
else if(etiqueta==0)
{
iz=ce=ce2=de=0;
}
else if(etiqueta>=10)
{
iz=ce=ce2=de=1;
}
fuzzy coste = new fuzzy();
coste.borrosotrapezoidal(iz, ce, ce2, de);
c.add(j,coste);
position_cost++;
}
cost.add(i,c);
}
}//else
String nombre;
if(par.minimum_risk==0)
nombre=par.OutputName+par.nameAlgorithm+"E_"+par.type_risk+cont+".dat";
else
nombre=par.OutputName+par.nameAlgorithm+"R_"+par.type_risk+cont+".dat";
String dist=par.OutputName+"Test1000"+par.nameAlgorithm+cont+".dat";
String columns = par.OutputName+par.nameAlgorithm+"Outputs"+cont+".dat";
String nombre_train = par.original_data+cont+"tra.dat";
String n_test=par.original_data+cont+"tst.dat";
AlgGenetic AG;
if(es_crisp==0)
{
AG= new AlgGenetic(npoblacion, muta,cross,particione, nclasses,X,C,W,niteraciones,reemplazar,costes,nombre,alfa,n_test,nombre_train,values_classes,cost,instances,par.dominance,par.winner_rule,0,matrix,es_crisp,dist,columns);
}
else//the data are crisp
AG= new AlgGenetic(npoblacion, muta,cross,particione, nclasses,X2,C1,P1,niteraciones,reemplazar,costes,nombre,alfa,n_test,nombre_train,values_classes,cost,instances,par.dominance,par.winner_rule,0,matrix,es_crisp,dist,columns);
cont++;
}
}
}