package keel.Algorithms.UnsupervisedLearning.AssociationRules.FuzzyRuleLearning.Fingrams;
/**
* <p>Title: DataBase</p>
* <p>Description: Fuzzy Data Base</p>
* <p>Copyright: Copyright KEEL (c) 2008</p>
* <p>Company: KEEL </p>
* @author Written by Jesus Alcal� (University of Granada) 09/02/2011
* @version 1.0
* @since JDK1.6
*/
import java.util.*;
import org.core.*;
public class DataBase {
int n_variables, partitions;
int[] nLabels;
boolean[] varReal;
Fuzzy[][] dataBase;
String names[];
public DataBase() {
}
/**
* <p>
* This method builds the database, creating the initial linguistic partitions
* </p>
* @param nLabels Number of Linguistic Values
* @param train Training dataset
* @return The databse
*/
public DataBase(String dataBaseFile, myDataset train) {
double rank, labels;
double[][] ranks = train.returnRanks();
this.n_variables = train.getnVars();
this.names = (train.names()).clone();
this.nLabels = new int[this.n_variables];
this.varReal = new boolean[this.n_variables];
this.dataBase = new Fuzzy[this.n_variables][];
StringTokenizer data, lines;
String dataBaseIni;
dataBaseIni = Files.readFile(dataBaseFile);
lines = new StringTokenizer(dataBaseIni, "\n\r");
lines.nextToken();
lines.nextToken();
for (int i = 0; i < this.n_variables; i++) {
rank = Math.abs(ranks[i][1] - ranks[i][0]);
if (train.isNominal(i)) {
lines.nextToken();
this.varReal[i] = false;
this.nLabels[i] = ((int) rank) + 1;
this.dataBase[i] = new Fuzzy[this.nLabels[i]];
for (int j = 0; j < this.nLabels[i]; j++) {
lines.nextToken();
this.dataBase[i][j] = new Fuzzy();
this.dataBase[i][j].name = new String(train.nameNominal(i, j));
this.dataBase[i][j].x0 = ranks[i][0] + (j - 1);
this.dataBase[i][j].x1 = ranks[i][0] + j;
this.dataBase[i][j].x3 = ranks[i][0] + (j + 1);
this.dataBase[i][j].y = 1.0;
}
lines.nextToken();
}
else {
this.varReal[i] = true;
data = new StringTokenizer(lines.nextToken(), " = \" ");
data.nextToken(); data.nextToken(); data.nextToken(); data.nextToken();
this.nLabels[i] = Integer.parseInt(data.nextToken());
this.dataBase[i] = new Fuzzy[this.nLabels[i]];
for (int j = 0; j < this.nLabels[i]; j++) {
this.dataBase[i][j] = new Fuzzy();
data = new StringTokenizer(lines.nextToken(), " = \" ");
data.nextToken();
this.dataBase[i][j].name = new String(data.nextToken());
this.dataBase[i][j].x0 = Double.parseDouble(data.nextToken());
this.dataBase[i][j].x1 = Double.parseDouble(data.nextToken());
this.dataBase[i][j].x3 = Double.parseDouble(data.nextToken());
this.dataBase[i][j].y = 1.0;
}
lines.nextToken();
}
}
}
public int numVariables() {
return (this.n_variables);
}
public int getnLabelsReal() {
int i, count;
count = 0;
for (i=0; i < n_variables; i++) {
if (varReal[i]) count += this.nLabels[i];
}
return (count);
}
public int numLabels(int variable) {
return (this.nLabels[variable]);
}
public int[] getnLabels() {
return (this.nLabels);
}
public int posValue (int variable, String value){
int i;
for (i=0; i < this.nLabels[variable]; i++) {
if (this.dataBase[variable][i].name.equalsIgnoreCase(value)) return (i);
}
return (-1);
}
public double matching(int variable, int label, double value) {
if ((variable < 0) || (label < 0)) return (1); // Don't care
else return (this.dataBase[variable][label].Fuzzifica(value));
}
public String print(int var, int label) {
return (this.dataBase[var][label].getName());
}
}