// returns the distribution of trainingNode memeber genes among left and right children private Dimension runNodeEpoch(SOTACell trainingNode) { SOTACell myCell = null; SOTACell sisterCell = null; int rightCnt = 0; int leftCnt = 0; int memberGene = 0; // for all genes in the training node, find closest child, migrate child for (int geneNum = 0; geneNum < trainingNode.members.size(); geneNum++) { memberGene = ((Integer) trainingNode.members.elementAt(geneNum)).intValue(); myCell = findMyDaughterCell(trainingNode, memberGene); // only look among children // dont add to membership // later make sure that left and right membership set is not null if (myCell == trainingNode.left) leftCnt++; else rightCnt++; myCell.migrateCentroid(memberGene, migW); sisterCell = findSister(myCell); // if sister has no offspring then migrate parent and sister if (sisterCell.left == null && sisterCell.right == null) { myCell.parent.migrateCentroid(memberGene, migP); sisterCell.migrateCentroid(memberGene, migS); } } return new Dimension(leftCnt, rightCnt); }