Hi, Code maybe more clear: https://github.com/chentao106/commons-math/commit/0075cd76f540955ec7da3dc4b74f4d67d932ba3b
>Hello. > >Le mer. 11 mars 2020 à 07:28, chentao...@qq.com <chentao...@qq.com> a écrit : >> >> Hi all, >> The "EmptyClusterStrategy" in KMeansPlusPlusClusterer can be reused >>MiniBatchKMeansClusterer and other cluster altorithm. >> So I think the "EmptyClusterStrategy" should move out from >>KMeansPlusPlusClusterer(JIRA issue #MATH-1525). >> I am not sure if my design is good or not. > >I can't say either; please provide more context/explanation >about the excerpts below. > >> I think here should be a interface: >> >> Solution 1: Explicit indicate the usage by class name and function name. >> ```java >> @FunctionalInterface >> public interface ClusterBreeder { >> <T extends Clusterable> T newCenterPoint((final >>Collection<CentroidCluster<T extends Clusterable>> clusters); >> } > >What is a "Breeder"? >This seems to further complicates the matter; what is a "center" (if there >can be old and new ones). > >Regards, >Gilles > >> ... >> // Implementations >> public LargestVarianceClusterPointBreeder implements ClusterBreeder{...} >> public MostPopularClusterPointBreeder implements ClusterBreeder{...} >> public FarthestPointBreeder implements ClusterBreeder{...} >> ... >> // Usage >> // KMeansPlusPlusClusterer.java >> public class KMeansPlusPlusClusterer<T extends Clusterable> extends >> Clusterer<T> { >> ... >> private final ClusterBreeder clusterBreeder; >> public KMeansPlusPlusClusterer(final int k, final int maxIterations, >> final DistanceMeasure measure, >> final UniformRandomProvider random, >> final ClusterBreeder clusterBreeder) { >> ... >> this.clusterBreeder=clusterBreeder; >> } >> ... >> public List<CentroidCluster<T>> cluster(final Collection<T> points) { >> ... >> if (cluster.getPoints().isEmpty()) { >> if (clusterBreeder == null) { >> throw new >>ConvergenceException(LocalizedFormats.EMPTY_CLUSTER_IN_K_MEANS); >> } else { >> newCenter = clusterBreeder.newCenterPoint(clusters); >> } >> } >> ... >> } >> } >> ``` >> >> Solution2: Declare a more generic interface: >> ```java >> @FunctionalInterface >> public interface ClustersPointFinder { >> <T extends Clusterable> T find((final Collection<CentroidCluster<T >>extends Clusterable>> clusters); >> } >> >> ... >> // Implementations >> public LargestVarianceClusterPointFinder implements ClustersPointFinder {...} >> public MostPopularClusterPointFinder implements ClustersPointFinder {...} >> public FarthestPointFinder implements ClustersPointFinder {...} >> ``` >> >> Thanks, >> -CT > >--------------------------------------------------------------------- >To unsubscribe, e-mail: dev-unsubscr...@commons.apache.org >For additional commands, e-mail: dev-h...@commons.apache.org > >