/* * 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.util.NumberUtil; import br.uff.ic.oceano.ostra.model.DataMiningPattern; import br.uff.ic.oceano.ostra.model.DataMiningResult; import java.util.ArrayList; import java.util.LinkedList; import java.util.List; /** * * @author DanCastellani */ public class Behavior { private DataMiningResult dataMiningResult; private List<DataMiningPattern> rules = new ArrayList<DataMiningPattern>(); private String value = ""; private Double highestConfidence = 0D; //prefix private static final String PROPORTIONAL = "proportional_"; private static final String INVERSE = "inverse_"; private static final String NEUTRAL = "neutral"; //proportional private static final String PROPORTIONAL_MINUS = PROPORTIONAL + "minus"; private static final String PROPORTIONAL_PLUS = PROPORTIONAL + "plus"; private static final String PROPORTIONAL_BOTH = PROPORTIONAL + "both"; //inverse private static final String INVERSE_MINUS_PLUS = INVERSE + "minus_plus"; private static final String INVERSE_PLUS_MINUS = INVERSE + "plus_minus"; private static final String INVERSE_BOTH = INVERSE + "both"; private static final String INVERSE_NEUTRAL_MINUS = INVERSE + "neutral_minus"; private static final String INVERSE_NEUTRAL_PLUS = INVERSE + "neutral_plus"; //undefined private static final String UNDEFINED = "undefined"; private static final String NO_BEHAVIOR = "no_behavior"; public String getFormatedRules() { String s = ""; for (DataMiningPattern rule : rules) { s += rule.toString() + "<br/>"; } return s; } public String getBehaviorName() { return getBehaviorName_Real(); } public String getBehaviorName_Real() { List<String> behaviors = new LinkedList<String>(); for (DataMiningPattern dataMiningPattern : rules) { behaviors.add(getSimpleBehaviorName(dataMiningPattern)); } final boolean hasNeutralBehavior = existsBehavior(behaviors, NEUTRAL); final boolean hasProportionalBehavior = existsBehavior(behaviors, PROPORTIONAL); final boolean hasInverseBehavior = existsBehavior(behaviors, INVERSE); if (hasInverseBehavior && hasProportionalBehavior) { return UNDEFINED; } if (hasInverseBehavior) { if (hasNeutralBehavior) { //because neutral is proportional (0 -> 0) return UNDEFINED; } else { final boolean hasInverseMinusPlus = existsBehavior(behaviors, INVERSE_MINUS_PLUS); final boolean hasInversePlusMinus = existsBehavior(behaviors, INVERSE_PLUS_MINUS); final boolean hasInverseNeutralMinus = existsBehavior(behaviors, INVERSE_NEUTRAL_MINUS); final boolean hasInverseNeutralPlus = existsBehavior(behaviors, INVERSE_NEUTRAL_PLUS); // if (hasInverseMinusPlus && hasInversePlusMinus) { // return INVERSE_BOTH; // } if (hasInverseMinusPlus) { return INVERSE_MINUS_PLUS; } if (hasInversePlusMinus) { return INVERSE_PLUS_MINUS; } if (hasInverseNeutralMinus && hasInverseNeutralPlus) { DataMiningPattern betterPattern = null; final String dataMiningMetricName = dataMiningResult.getRuleMetricName(); for (DataMiningPattern currentDataMiningPattern : rules) { if (betterPattern == null) { betterPattern = currentDataMiningPattern; } if (betterPattern.getMetricValue(dataMiningMetricName) < currentDataMiningPattern.getMetricValue(dataMiningMetricName)) { betterPattern = currentDataMiningPattern; } else if (betterPattern.getMetricValue(dataMiningMetricName) == currentDataMiningPattern.getMetricValue(dataMiningMetricName)) { if (betterPattern.getSupport() < currentDataMiningPattern.getSupport()) { betterPattern = currentDataMiningPattern; } } } return getSimpleBehaviorName(betterPattern); // return INVERSE_BOTH; } if (hasInverseNeutralMinus) { return INVERSE_NEUTRAL_MINUS; } if (hasInverseNeutralPlus) { return INVERSE_NEUTRAL_PLUS; } } } else if (hasProportionalBehavior) { final boolean hasProportionalMinus = existsBehavior(behaviors, PROPORTIONAL_MINUS); final boolean hasProportionalPlus = existsBehavior(behaviors, PROPORTIONAL_PLUS); //as for proportional behavior, the neutral doesnt influence, we will ignore it. if (hasProportionalMinus && hasProportionalPlus) { DataMiningPattern betterPattern = null; final String dataMiningMetricName = dataMiningResult.getRuleMetricName(); for (DataMiningPattern currentDataMiningPattern : rules) { if (betterPattern == null) { betterPattern = currentDataMiningPattern; } if (betterPattern.getMetricValue(dataMiningMetricName) < currentDataMiningPattern.getMetricValue(dataMiningMetricName)) { betterPattern = currentDataMiningPattern; } else if (betterPattern.getMetricValue(dataMiningMetricName) == currentDataMiningPattern.getMetricValue(dataMiningMetricName)) { if (betterPattern.getSupport() < currentDataMiningPattern.getSupport()) { betterPattern = currentDataMiningPattern; } } } return getSimpleBehaviorName(betterPattern); // return PROPORTIONAL_BOTH; } if (hasProportionalMinus) { return PROPORTIONAL_MINUS; } if (hasProportionalPlus) { return PROPORTIONAL_PLUS; } } else if (hasNeutralBehavior) { return NEUTRAL; } return NO_BEHAVIOR; } private String getSimpleBehaviorName(DataMiningPattern rule) { final String behavior = getRuleBehavior(rule); if (behavior.equals("--")) { return PROPORTIONAL_MINUS; } else if (behavior.equals("++")) { return PROPORTIONAL_PLUS; } else if (behavior.equals("00")) { return NEUTRAL; } else if (behavior.equals("-+")) { return INVERSE_MINUS_PLUS; } else if (behavior.equals("-0")) { return INVERSE_NEUTRAL_MINUS; } else if (behavior.equals("+-")) { return INVERSE_PLUS_MINUS; } else if (behavior.equals("+0")) { return INVERSE_NEUTRAL_PLUS; } else if (behavior.equals("0+")) { return INVERSE_NEUTRAL_PLUS; } else if (behavior.equals("0-")) { return INVERSE_NEUTRAL_MINUS; } else { return NO_BEHAVIOR; } } public Behavior(DataMiningResult dataMiningResult) { this.dataMiningResult = dataMiningResult; } public Behavior(String value, DataMiningResult dataMiningResult) { this.value = value; this.dataMiningResult = dataMiningResult; } /** * @return the rules */ public List<DataMiningPattern> getRules() { return rules; } /** * @param rules the rules to set */ public void setRules(List<DataMiningPattern> rules) { this.rules = rules; } /** * @return the value */ public String getValue() { return value; } /** * @return the value */ public String getShortValue() { if (value.length() >= 3) { return value.substring(0, 3); } else { return value; } } /** * @param value the value to set */ public void setValue(String value) { this.value = value; } @Override public String toString() { return value; } /** * @return the highestConfidence */ public Double getHighestConfidence() { return highestConfidence; } /** * @return the highestConfidence */ public String getFormatedHighestConfidence() { return NumberUtil.format(highestConfidence); } /** * @param highestConfidence the highestConfidence to set */ public void setHighestConfidence(Double highestConfidence) { this.highestConfidence = highestConfidence; } private static String getRuleBehavior(DataMiningPattern rule) { return DataMiningPattern.getValue(rule.getPrecedent()) + DataMiningPattern.getValue(rule.getConsequent()); } private boolean existsBehavior(List<String> behaviors, String prefix) { for (String behavior : behaviors) { if (behavior.startsWith(prefix)) { return true; } } return false; } public String getAverageSuport() { double sum = 0; for (DataMiningPattern rule : rules) { sum += rule.getSupport()!=null?rule.getSupport():0.0; } return NumberUtil.format((rules != null && !rules.isEmpty()) ? sum / rules.size() : sum); } public String getAverageConfidence() { double sum = 0; for (DataMiningPattern rule : rules) { sum += rule.getConfidence()!=null?rule.getConfidence():0.0; } return NumberUtil.format((rules != null && !rules.isEmpty()) ? sum / rules.size() : sum); } public String getAverageLift() { double sum = 0; for (DataMiningPattern rule : rules) { sum += rule.getLift()!=null?rule.getLift():0.0; } return NumberUtil.format((rules != null && !rules.isEmpty()) ? sum / rules.size() : sum); } /** * @return the dataMiningResult */ public DataMiningResult getDataMiningResult() { return dataMiningResult; } /** * @param dataMiningResult the dataMiningResult to set */ public void setDataMiningResult(DataMiningResult dataMiningResult) { this.dataMiningResult = dataMiningResult; } }