package x10; public class KMeansDist { //static int DIM=2; //static int CLUSTERS=4; static final int POINTS=2000; static final int ITERATIONS=50; //static int points_region[][] = new int[POINTS-1][DIM-1]; public static void main(String args[]) { int PLACES=args.length; //DZ: this is supposed to be static //(as the number of processors) //through the execution; anyway, we //leave it as a parameter //val rnd = PlaceLocalHandle.make[Random](Dist.makeUnique(), () => new Random(0)); //val local_curr_clusters = PlaceLocalHandle.make[Rail[Float]](Dist.makeUnique(), //() => Rail.make[Float](CLUSTERS*DIM, (i:Int) => 0 as Float)); //val local_new_clusters = PlaceLocalHandle.make[Rail[Float]](Dist.makeUnique(), //() => Rail.make[Float](CLUSTERS*DIM, (i:Int) => 0 as Float)); //val local_cluster_counts = PlaceLocalHandle.make[Rail[Int]](Dist.makeUnique(), // ()=> Rail.make[Int](CLUSTERS, (i:Int) => 0)); //int local_cluster_counts[]; //val points_dist = Dist.makeBlock(points_region, 0); //val points = DistArray.make[Float](points_dist, (p:Point)=>rnd().nextFloat()); //val central_clusters = Rail.make[Float](CLUSTERS*DIM, (i:Int) => { //val p = Point.make([i/DIM, i%DIM]); //return at (points_dist(p)) points(p); //}); //val central_cluster_counts = Rail.make[Int](CLUSTERS, (i:Int) => 0); //DZ //int central_cluster_counts[] = new int[CLUSTERS]; for (int i=1; i<=ITERATIONS; i++) { //int central_clusters_copy[]; //for (int j=0; j<CLUSTERS; j++) { central_clusters_copy[j] = central_cluster_counts[j]; }; //for (int j=0; j<CLUSTERS; j++) { local_cluster_counts[][j] = 0; } Conc.finish_begin(); main_1(PLACES); Conc.finish_end(); Conc.finish_begin(); main_2(); Conc.finish_end(); //for (var j:Int=0 ; j<DIM*CLUSTERS ; ++j) { //central_clusters(j) = 0; //} //for (var j:Int=0 ; j<CLUSTERS ; ++j) { //central_cluster_counts(j) = 0; //} Conc.finish_begin(); main_3(PLACES); Conc.finish_end(); //for (var k:Int=0 ; k<CLUSTERS ; ++k) { //for (var d:Int=0 ; d<DIM ; ++d) { //central_clusters(k*DIM+d) /= central_cluster_counts(k); //} //} // TEST FOR CONVERGENCE //var b:Boolean = true; //for (var j:Int=0 ; j<CLUSTERS*DIM ; ++j) { // if (Math.abs(central_clusters_copy(j)-central_clusters(j))>0.0001) { // b = false; // break; // } //} //if (b) break; } } public static void main_1(int PLACES) { // reset state for (int d=0; d<PLACES; d++) { Conc.async_begin(); // async(d) { main_11(); Conc.async_end(); } } public static void main_11() { //for (int j=0 ; j<DIM*CLUSTERS; j++) { //local_curr_clusters[][j] = central_clusters_copy[j]; //local_new_clusters[][j] = 0; //} //for (int j=0 ; j<CLUSTERS; j++) { //local_cluster_counts[][j] = 0; //} } public static void main_2() { for (int p_=0; p_<POINTS; p_++) { int p = p_; Conc.async_begin(); main_21(); Conc.async_end(); } } public static void main_21() { //async (points_dist(p,0)) { //var closest:Int = -1; //var closest_dist:Float = Float.MAX_VALUE; //for (var k:Int=0 ; k<CLUSTERS ; ++k) { //var dist : Float = 0; //for (var d:Int=0 ; d<DIM ; ++d) { //val tmp = points(Point.make(p,d)) - local_curr_clusters()(k*DIM+d); //dist += tmp * tmp; //} //if (dist < closest_dist) { //closest_dist = dist; //closest = k; //} //} //for (var d:Int=0 ; d<DIM ; ++d) { //local_new_clusters()(closest*DIM+d) += points(Point.make(p,d)); //} //local_cluster_counts()(closest)++; //} } public static void main_3(int PLACES) { for (int d=0; d<PLACES; d++) { Conc.async_begin(); main_31(); Conc.async_end(); } } public static void main_31() { //val local_new_clusters_copy = //ValRail.make(CLUSTERS*DIM, (i:Int) => local_new_clusters()(i)); //val local_cluster_counts_copy = //ValRail.make(CLUSTERS, (i:Int) => local_cluster_counts()(i)); //at (central_clusters) atomic { //for (var j:Int=0 ; j<DIM*CLUSTERS ; ++j) { //central_clusters(j) += local_new_clusters()(j); //} //for (var j:Int=0 ; j<CLUSTERS ; ++j) { //central_cluster_counts(j) += local_cluster_counts()(j); //} //} } }