public void EnumeratorTest()
        {
            ClusterPoint p = new ClusterPoint(1, 2, Guid.NewGuid());
            MemoryStream stream = new MemoryStream();
            const int NumElements = 5;
            for (int i = 0; i < NumElements; i++)
            {
                stream.Write(p.ToByteArray(), 0, ClusterPoint.Size);
            }

            ObjectStreamReader<ClusterPoint> pointStream = new ObjectStreamReader<ClusterPoint>(new MemoryStream(stream.ToArray()), ClusterPoint.FromByteArray, ClusterPoint.Size);
            Assert.AreEqual(p.CentroidID, pointStream.First().CentroidID);

            DateTime serialStart = DateTime.Now;
            int[] serialOutput = pointStream.Select(point =>
            {
                System.Threading.Thread.Sleep(200);
                return 1;
            }).ToArray();
            DateTime serialEnd = DateTime.Now;
            Assert.AreEqual(NumElements, serialOutput.Length);

            DateTime parallelStart = DateTime.Now;
            int[] parallelOutput = pointStream.AsParallel().Select(point =>
            {
                System.Threading.Thread.Sleep(200);
                return 1;
            }).ToArray();
            DateTime parallelEnd = DateTime.Now;
            Assert.AreEqual(NumElements, parallelOutput.Length);

            System.Diagnostics.Trace.WriteLine(string.Format("serial: {0}, parallel: {1}",
                (serialEnd - serialStart).TotalSeconds,
                (parallelEnd - parallelStart).TotalSeconds));
        }
        private ClusterPointProcessingResult AssignClusterPointToNearestCentroid(ClusterPoint clusterPoint)
        {
            // TODO: Try in-place modification to see the performance impact
            ClusterPoint result = new ClusterPoint(clusterPoint);
            result.CentroidID = centroids.MinElement(centroid => Point.Distance(clusterPoint, centroid)).ID;

            return new ClusterPointProcessingResult
            {
                Point = result,
                PointWasChanged = clusterPoint.CentroidID != result.CentroidID
            };
        }
        private ClusterPointProcessingResult AssignClusterPointToNearestCentroid(ClusterPoint clusterPoint)
        {
            // TODO: Try in-place modification to see the performance impact
            ClusterPoint result = new ClusterPoint(clusterPoint);

            result.CentroidID = centroids.MinElement(centroid => Point.Distance(clusterPoint, centroid)).ID;

            return(new ClusterPointProcessingResult
            {
                Point = result,
                PointWasChanged = clusterPoint.CentroidID != result.CentroidID
            });
        }
        public void ClusterPointConstructorTest()
        {
            Point p = new Point
            {
                X = 3.25F,
                Y = 4.12F
            };
            Guid centroidID = Guid.NewGuid();

            ClusterPoint target = new ClusterPoint(p, centroidID);

            Assert.AreEqual(p.X, target.X);
            Assert.AreEqual(p.Y, target.Y);
            Assert.AreEqual(centroidID, target.CentroidID);
        }
        public void AssignClusterPointToNearestCentroidTest()
        {
            KMeansTaskData task = new KMeansTaskData(Guid.NewGuid(), Guid.NewGuid(), 1, null, 2, 3, 10, 0, null, DateTime.Now, DateTime.Now, 0, null);
            KMeansTaskProcessor_Accessor target = new KMeansTaskProcessor_Accessor(task);

            target.centroids = new List<Centroid>();
            target.centroids.Add(new Centroid
            {
                ID = Guid.NewGuid(),
                X = 0.0F,
                Y = -1.0F
            });
            target.centroids.Add(new Centroid
            {
                ID = Guid.NewGuid(),
                X = 10.0F,
                Y = 10.0F
            });

            ClusterPoint clusterPoint = new ClusterPoint
            {
                CentroidID = Guid.Empty,
                X = 1.0F,
                Y = 2.0F
            };

            ClusterPoint expected = new ClusterPoint
            {
                CentroidID = target.centroids[0].ID,
                X = 1.0F,
                Y = 2.0F
            };
            ClusterPointProcessingResult_Accessor actual;
            actual = target.AssignClusterPointToNearestCentroid(clusterPoint);

            Assert.AreEqual(expected.CentroidID, actual.Point.CentroidID);
        }
        public void FromByteArrayTest()
        {
            Guid centroidID = Guid.NewGuid();

            MemoryStream stream = new MemoryStream();
            stream.Write(BitConverter.GetBytes(2.53), 0, sizeof(double));
            stream.Write(BitConverter.GetBytes(4.56), 0, sizeof(double));
            stream.Write(centroidID.ToByteArray(), 0, 16);
            byte[] bytes = stream.ToArray();

            ClusterPoint expected = new ClusterPoint
            {
                X = 2.53F,
                Y = 4.56F,
                CentroidID = centroidID
            };
            ClusterPoint actual;
            actual = ClusterPoint.FromByteArray(bytes);

            const double Epsilon = 0.0001;
            Assert.IsTrue(Math.Abs(expected.X - actual.X) < Epsilon);
            Assert.IsTrue(Math.Abs(expected.Y - actual.Y) < Epsilon);
            Assert.AreEqual(expected.CentroidID, actual.CentroidID);
        }
        public void ToByteArrayTest()
        {
            Guid centroidID = Guid.NewGuid();
            ClusterPoint target = new ClusterPoint
            {
                X = 1.23,
                Y = 3.45,
                CentroidID = centroidID
            };

            MemoryStream stream = new MemoryStream();
            stream.Write(BitConverter.GetBytes(1.23), 0, sizeof(double));
            stream.Write(BitConverter.GetBytes(3.45), 0, sizeof(double));
            stream.Write(centroidID.ToByteArray(), 0, 16);
            byte[] expected = stream.ToArray();

            byte[] actual;
            actual = target.ToByteArray();
            Assert.AreEqual(expected.Length, actual.Length);
            for (int i = 0; i < expected.Length; i++)
            {
                Assert.AreEqual(expected[i], actual[i]);
            }
        }
 public ClusterPoint(ClusterPoint other)
     : base(other)
 {
     this.CentroidID = other.CentroidID;
 }
 public ClusterPoint(ClusterPoint other)
     : base(other)
 {
     this.CentroidID = other.CentroidID;
 }
        public void ProcessWorkerResponseTest()
        {
            KMeansJobData jobData = new KMeansJobData(Guid.NewGuid(), 4, null, 2, 10, DateTime.Now);
            KMeansJob_Accessor target = new KMeansJob_Accessor(jobData, "server");
            target.InitializeStorage();

            // Upload a block with an arbitrary ClusterPoint, so we can verify it gets copied
            ClusterPoint arbitraryPoint = new ClusterPoint(1, 2, Guid.NewGuid());
            List<string> blockList;
            using (ObjectCachedBlockWriter<ClusterPoint> pointPartitionWriteStream = new ObjectCachedBlockWriter<ClusterPoint>(target.Points, point => point.ToByteArray(), ClusterPoint.Size,
                Environment.GetEnvironmentVariable("TEMP") + @"\" + Guid.NewGuid().ToString()))
            {
                pointPartitionWriteStream.Write(arbitraryPoint);
                pointPartitionWriteStream.FlushBlock();
                blockList = pointPartitionWriteStream.BlockList;
            }

            KMeansTaskData taskData = new KMeansTaskData(jobData, Guid.NewGuid(), 0, 1, target.Centroids.Uri, DateTime.Now, 0, null);

            target.tasks.Clear();
            target.tasks.Add(new KMeansTask(taskData));

            KMeansTaskResult taskResult = new KMeansTaskResult(taskData);
            CloudBlob pointsBlockListBlob = AzureHelper.CreateBlob(jobData.JobID.ToString(), Guid.NewGuid().ToString());
            using (Stream stream = pointsBlockListBlob.OpenWrite())
            {
                BinaryFormatter bf = new BinaryFormatter();
                bf.Serialize(stream, blockList);
            }
            taskResult.PointsBlockListBlob = pointsBlockListBlob.Uri;
            taskResult.NumPointsChanged = 2;
            Guid centroidID = Guid.NewGuid();
            taskResult.PointsProcessedDataByCentroid = new Dictionary<Guid, PointsProcessedData> {
                { centroidID, new PointsProcessedData() {
                        NumPointsProcessed = 2,
                        PartialPointSum = new Point(1, 2)
                    }
                }
            };
            target.ProcessWorkerResponse(taskResult, new List<Worker>());

            // Verify that the first ClusterPoint in Points is indeed equal to arbitraryPoint
            using (ObjectStreamReader<ClusterPoint> pointsStream = new ObjectStreamReader<ClusterPoint>(target.Points, ClusterPoint.FromByteArray, ClusterPoint.Size))
            {
                ClusterPoint point = pointsStream.First();
                Assert.AreEqual(arbitraryPoint.X, point.X);
                Assert.AreEqual(arbitraryPoint.Y, point.Y);
                Assert.AreEqual(arbitraryPoint.CentroidID, point.CentroidID);
            }
        }