public Distribution<T> merge(Distribution<T> current, Distribution<T> newBit) { // ToDo iterare sull indice piu corto DiscreteProbabilityDistribution<T> currentDD = (DiscreteProbabilityDistribution<T>) current; DiscreteProbabilityDistribution<T> newBitDD = (DiscreteProbabilityDistribution<T>) newBit; Map<T, Degree> map = new HashMap<T, Degree>(); Degree denominator = null; int i = 0; for (Iterator<T> currIt = currentDD.getSupport().iterator(); currIt.hasNext(); ) { T tempT = currIt.next(); if (newBitDD.getDistribution().containsKey(tempT)) { if (i == 0) { denominator = newBitDD.getDegree(tempT).mul(current.getDegree(tempT)); i++; } else denominator = denominator.sum(newBitDD.getDegree(tempT).mul(current.getDegree(tempT))); } } for (Iterator<T> currIt = currentDD.getSupport().iterator(); currIt.hasNext(); ) { T tempT = currIt.next(); if (newBitDD.getDistribution().containsKey(tempT)) { Degree temp = (newBitDD.getDegree(tempT).mul(current.getDegree(tempT))).div(denominator); map.put(tempT, temp); } } currentDD.getDistribution().clear(); currentDD.getDistribution().putAll(map); return currentDD; }
public Distribution<T> mergeAsNew(Distribution<T> current, Distribution<T> newBit) { DiscreteProbabilityDistribution<T> currentDD = (DiscreteProbabilityDistribution<T>) current; DiscreteProbabilityDistribution<T> newBitDD = (DiscreteProbabilityDistribution<T>) newBit; DiscreteDistribution<T> ret = new DiscreteDistribution<T>(); Degree denominator = null; int i = 0; if (newBitDD.getSupport().size() < currentDD.getSupport().size()) { for (Iterator<T> newBitIt = newBitDD.getSupport().iterator(); newBitIt.hasNext(); ) { T tempT = newBitIt.next(); if (currentDD.getDistribution().containsKey(tempT)) { if (i == 0) { denominator = currentDD.getDegree(tempT).mul(newBit.getDegree(tempT)); i++; } else denominator = denominator.sum(currentDD.getDegree(tempT).mul(newBit.getDegree(tempT))); } } for (Iterator<T> newBitIt = newBitDD.getSupport().iterator(); newBitIt.hasNext(); ) { T tempT = newBitIt.next(); if (currentDD.getDistribution().containsKey(tempT)) { Degree temp = (currentDD.getDegree(tempT).mul(newBit.getDegree(tempT))).div(denominator); ret.put(tempT, temp); } } } else { i = 0; for (Iterator<T> currIt = currentDD.getSupport().iterator(); currIt.hasNext(); ) { T tempT = currIt.next(); if (newBitDD.getDistribution().containsKey(tempT)) { if (i == 0) { denominator = newBitDD.getDegree(tempT).mul(current.getDegree(tempT)); i++; } else denominator = denominator.sum(newBitDD.getDegree(tempT).mul(current.getDegree(tempT))); } } for (Iterator<T> currIt = currentDD.getSupport().iterator(); currIt.hasNext(); ) { T tempT = currIt.next(); if (newBitDD.getDistribution().containsKey(tempT)) { Degree temp = (newBitDD.getDegree(tempT).mul(current.getDegree(tempT))).div(denominator); ret.put(tempT, temp); } } } return ret; }