// This function will get triggered/executed when a new message is written // on an Azure Queue called queue. public static void StartClusterAnalysis([QueueTrigger("clusterqueue")] int clusterCalculationId, TextWriter log) { Task.Factory.StartNew(() => { using (var context = new SvdEntities()) { ClusterOptimizer.OptimizeRange(context, clusterCalculationId); } }); }
public JsonResult GetClusters(int jobId, int k = 2) { var nameList = new Dictionary <string, List <string> >(); var start = DateTime.Now; var cluster = ClusterOptimizer.OptimizeRange(_context, new ClusterCalculationParameters() { MinimumClusterCount = 20, MaximumClusterCount = 20, IterationsPerCluster = 1, MaximumOptimizationsCount = 200, JobId = jobId }); Debug.WriteLine($"Total Optimization Time: {DateTime.Now.Subtract(start).TotalMilliseconds} Milliseconds"); for (var i = 0; i < cluster.ClusterMap.Count; i++) { var fileName = LSA.MatrixContainer.DocNameMap[i]; if (!nameList.ContainsKey(cluster.ClusterMap[i].ToString())) { nameList[cluster.ClusterMap[i].ToString()] = new List <string>(); } nameList[cluster.ClusterMap[i].ToString()].Add(fileName); } return(Json(new { GlobalSI = cluster.GlobalSi, ClusterSIAverage = cluster.GlobalClusterSiAverage, ClusterSiList = cluster.ClusterSiAverages, NameList = nameList, NumClusters = cluster.Clusters }, JsonRequestBehavior.AllowGet)); }
public IList <Cluster> SearchClusters(double radius, IList <Dot> dots) { int i = 0; double range = int.MaxValue;//radius * radius; Dot[] copy = new Dot[dots.Count]; dots.CopyTo(copy, 0); var dotsToCluster = copy.ToList(); List <Cluster> clusters = new List <Cluster>(dots.Count); Dot middlePoint = default; while (dotsToCluster.Count > 0) { middlePoint = dotsToCluster.OrderBy(d => d.GetDistance(middlePoint)).First(); var dotsInRange = dotsToCluster .Where(d => d.GetDistance(middlePoint) <= range) .OrderBy(d => d.GetDistance(middlePoint)) .ToList(); List <Dot> dotsInCluster = new List <Dot>(dotsInRange.Count()); if (dotsInRange.Any()) { foreach (var inRangeDot in dotsInRange) { if (dotsInCluster.Count > 0) { middlePoint = default; foreach (var dot in dotsInCluster) { middlePoint += dot; } middlePoint /= dotsInCluster.Count; } Dot displaced = (middlePoint + inRangeDot) / 2; dotsInCluster.Add(inRangeDot); if (dotsInCluster.Any(d => d.GetDistance(displaced) >= radius)) { dotsInCluster.Remove(inRangeDot); break; } else { middlePoint = displaced; } } } clusters.Add(new Cluster() { Dots = ColoredDots(dotsInCluster, i), Number = i, Radius = radius, RadiusDot = middlePoint }); dotsToCluster = dotsToCluster.Except(dotsInCluster).ToList(); i += 1; } clusters = ClusterOptimizer.RemoveSharedClusters(clusters); return(clusters); }