/** * KCentersAggregator.java */ package com.chinamobile.bcbsp.examples.kmeans; import java.util.ArrayList; import java.util.Iterator; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import com.chinamobile.bcbsp.api.Aggregator; /** * KCentersAggregator * * @author Bai Qiushi * @version 0.1 2012-2-28 */ public class KCentersAggregator extends Aggregator<KCentersAggregateValue> { public static final Log LOG = LogFactory.getLog(KCentersAggregator.class); @SuppressWarnings("unchecked") @Override public KCentersAggregateValue aggregate( Iterable<KCentersAggregateValue> values) { KCentersAggregateValue kcenters = new KCentersAggregateValue(); Iterator<KCentersAggregateValue> it = values.iterator(); ArrayList<ArrayList<Float>> contents = null; //Init the contents with the first aggregate value. if (it.hasNext()) { contents = (ArrayList<ArrayList<Float>>) it.next().getValue().clone(); } /*LOG.info("[KCentersAggregator] before aggregate contents: "); for (int i = 0; i < contents.size(); i ++) { String tmpCenter = ""; ArrayList<Float> center = contents.get(i); for (int j = 0; j < center.size(); j ++) { tmpCenter = tmpCenter + " " + center.get(j); } LOG.info("[KCentersAggregator] [" + tmpCenter + " ]"); }*/ //Sum the same class's coordinate values and point's counts into the content. while (it.hasNext()) { ArrayList<ArrayList<Float>> value = it.next().getValue(); /* if (value.size() > 0) { if (contents.size() == 0) { contents = value; } } else { continue; }*/ //Sum the corresponding element of the array except the first k rows. for (int i = 0; i < value.size(); i ++) { ArrayList<Float> center = contents.get(i); ArrayList<Float> valueCenter = value.get(i); for (int j = 0; j < valueCenter.size(); j ++) { center.set(j, center.get(j) + valueCenter.get(j)); } contents.set(i, center); } } /*LOG.info("[KCentersAggregator] after aggregate contents: "); for (int i = 0; i < contents.size(); i ++) { String tmpCenter = ""; ArrayList<Float> center = contents.get(i); for (int j = 0; j < center.size(); j ++) { tmpCenter = tmpCenter + " " + center.get(j); } LOG.info("[KCentersAggregator] [" + tmpCenter + " ]"); }*/ if (contents != null) kcenters.setValue(contents); return kcenters; } }