/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package br.uff.ic.oceano.ostra.service.behaviortable;
import br.uff.ic.oceano.core.factory.MetricManagerFactory;
import br.uff.ic.oceano.core.model.Metric;
import br.uff.ic.oceano.core.service.PersistenceService;
import br.uff.ic.oceano.core.tools.metrics.MetricManager;
import br.uff.ic.oceano.core.tools.metrics.expression.QMOOD;
import br.uff.ic.oceano.ostra.model.DataMiningPattern;
import br.uff.ic.oceano.ostra.model.DataMiningResult;
import java.util.Collections;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
/**
*
* @author DanCastellani
*/
public class BehaviorTableService implements PersistenceService {
private static int TABLE_SIZE = 7;
private static final String SYMBOL_PROPORTIONAL_BEHAVIOR = "+";
private static final String SYMBOL_OPOSITE_BEHAVIOR = "-";
private static final String SYMBOL_CONFLICTANT_BEHAVIOR = "0";
private static Map<String, Integer> mapAttributeIndices;
private static String[] attributeNames;
public void setup() {
mapAttributeIndices = new HashMap<String, Integer>();
int indice = 1;
//coloco tamanho = lenght + 1, pq a posição 0 ficará em branco
attributeNames = new String[QMOOD.QMOOD_QUALITY_ATTRIBUTES.length + 1];
for (String qaName : QMOOD.QMOOD_QUALITY_ATTRIBUTES) {
attributeNames[indice] = qaName;
mapAttributeIndices.put(qaName, indice++);
}
}
private void updateAttributeIndiceMap(DataMiningResult currentDataMiningResult) {
mapAttributeIndices = new HashMap<String, Integer>();
int indice = 1;
List<String> attributes = getAttributes(currentDataMiningResult);
Collections.sort(attributes);
for (String attributeName : attributes) {
mapAttributeIndices.put(attributeName, indice++);
}
attributeNames = new String[mapAttributeIndices.keySet().size() + 1];
for (String attributeName : mapAttributeIndices.keySet()) {
MetricManager mm = (MetricManager) MetricManagerFactory.getInstance().getMetricByName(attributeName);
System.out.println("mapAttributeIndices.get(attributeName) = " + mapAttributeIndices.get(attributeName));
System.out.println("mm.getMetric().getAcronym() = " + mm.getMetric().getAcronym());
attributeNames[mapAttributeIndices.get(attributeName)] = mm.getMetric().getAcronym();
}
TABLE_SIZE = attributeNames.length;
}
public synchronized Behavior[][] buildTable(DataMiningResult currentDataMiningResult) {
updateAttributeIndiceMap(currentDataMiningResult);
Behavior[][] behaviorTable = createDefaultTable(currentDataMiningResult);
final String ruleMetricName = currentDataMiningResult.getRuleMetricName();
for (DataMiningPattern dataMiningPattern : currentDataMiningResult.getDataMiningPatterns()) {
if (dataMiningPattern.getSize() != 2) {
continue;
}
final String pattern = dataMiningPattern.getPattern();
if (pattern.contains("project-revision")
|| pattern.contains("rdate")
|| pattern.contains("rcommiter")
|| pattern.contains("#files")
|| pattern.contains("rday")
|| pattern.contains("rhour")
|| pattern.contains("rcompile")) {
continue;
}
final String precedentAttribute = DataMiningPattern.getAttribute(dataMiningPattern.getPrecedent());
final String consequentAttribute = DataMiningPattern.getAttribute(dataMiningPattern.getConsequent());
final Integer precedentIndice = mapAttributeIndices.get(precedentAttribute);
final Integer consequentIndice = mapAttributeIndices.get(consequentAttribute);
if (precedentIndice == null || consequentIndice == null) {
continue;
}
final Behavior behavior = behaviorTable[precedentIndice][consequentIndice];
behavior.getRules().add(dataMiningPattern);
behavior.setValue(verifyBehaviors(behavior.getRules()));
//update max rule metric value
final Double highestValue = behavior.getHighestConfidence();
final Double actualValue = getRuleMetric(ruleMetricName, dataMiningPattern);
if (highestValue == null || actualValue > highestValue) {
behavior.setHighestConfidence(actualValue);
}
}
return behaviorTable;
}
private Behavior[][] createDefaultTable(DataMiningResult dataMiningResult) {
Behavior[][] behaviorTable = new Behavior[TABLE_SIZE][TABLE_SIZE];
for (int i = 0; i < behaviorTable.length; i++) {
for (int j = 0; j < behaviorTable[i].length; j++) {
if (j == 0 && i == 0) {
behaviorTable[i][j] = new Behavior(dataMiningResult);
} else if (j == 0) {
behaviorTable[i][j] = new Behavior(attributeNames[i], dataMiningResult);
// behaviorTable[i][j].getRules().add(attributeNames[i]);
} else if (i == 0) {
behaviorTable[i][j] = new Behavior(attributeNames[j], dataMiningResult);
// behaviorTable[i][j].getRules().add(attributeNames[j]);
} else {
behaviorTable[i][j] = new Behavior(dataMiningResult);
}
}
}
return behaviorTable;
}
private String verifyBehavior(String oneValue, String otherValue) {
if (oneValue.equals(otherValue)) {
return SYMBOL_PROPORTIONAL_BEHAVIOR;
} else {
return SYMBOL_OPOSITE_BEHAVIOR;
}
}
private String verifyBehaviors(List<DataMiningPattern> rules) {
boolean proportionalBehavior = false;
boolean opositeBehavior = false;
for (DataMiningPattern rule : rules) {
String behavior = verifyBehavior(DataMiningPattern.getValue(rule.getPrecedent()), DataMiningPattern.getValue(rule.getConsequent()));
if (behavior.equals(SYMBOL_PROPORTIONAL_BEHAVIOR)) {
proportionalBehavior = true;
} else if (behavior.equals(SYMBOL_OPOSITE_BEHAVIOR)) {
opositeBehavior = true;
}
}
if (opositeBehavior && proportionalBehavior) {
return SYMBOL_CONFLICTANT_BEHAVIOR;
} else if (opositeBehavior) {
return SYMBOL_OPOSITE_BEHAVIOR;
} else {
return SYMBOL_PROPORTIONAL_BEHAVIOR;
}
}
private Double getRuleMetric(String ruleMetricName, DataMiningPattern dataMiningPattern) {
if (ruleMetricName.equals("Confidence")) {
// System.out.println("metric = Confidence");
return dataMiningPattern.getConfidence();
}
if (ruleMetricName.equals("Lift")) {
// System.out.println("metric = lift");
return dataMiningPattern.getLift();
}
if (ruleMetricName.equals("Leverage")) {
// System.out.println("metric = Leverage");
return dataMiningPattern.getLeverage();
}
if (ruleMetricName.equals("Conviction")) {
// System.out.println("metric = Conviction");
return dataMiningPattern.getConviction();
}
return null;
}
private List<String> getAttributes(DataMiningResult dataMiningResult) {
List<String> returningAttributes = new LinkedList<String>();
final String arff = dataMiningResult.getArff();
for (String line : arff.substring(0, arff.indexOf("@DATA")).split("\n")) {
if (line.startsWith("@ATTRIBUTE")) {
if (line.contains("project-revision")
|| line.contains("rdate")
|| line.contains("rcommiter")
|| line.contains("#files")
|| line.contains("rday")
|| line.contains("rhour")
|| line.contains("rRound")
|| line.contains("rcompile")) {
continue;
}
String attributeName;
if (line.contains("\"")) {
attributeName = line.substring(line.indexOf("\"") + 1);
attributeName = attributeName.substring(0, attributeName.indexOf("\""));
} else {
attributeName = line.split(" ")[1];
}
attributeName = attributeName.substring("dAvg-".length());
// System.out.println("attributeName = " + attributeName);
returningAttributes.add(attributeName);
}
}
return returningAttributes;
}
}