- Timestamp:
- 04/12/16 13:28:23 (9 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/PerformanceComparison/HeuristicLab.OptimizationExpertSystem.Common/3.3/KnowledgeCenter.cs
r13751 r13752 46 46 [Creatable(CreatableAttribute.Categories.TestingAndAnalysis, Priority = 119)] 47 47 public sealed class KnowledgeCenter : IContent { 48 private bool SuppressEvents { get; set; } 48 49 49 50 public string Filename { get; set; } … … 90 91 91 92 private readonly CheckedItemList<StringValue> problemCharacteristics; 92 public CheckedItemList<StringValue> ProblemCharacteristics { 93 get { return problemCharacteristics; } 93 private readonly ReadOnlyCheckedItemList<StringValue> readonlyProblemCharacteristics; 94 public ReadOnlyCheckedItemList<StringValue> ProblemCharacteristics { 95 get { return readonlyProblemCharacteristics; } 94 96 } 95 97 … … 121 123 problemInstances = new RunCollection(); 122 124 problemCharacteristics = new CheckedItemList<StringValue>(); 125 readonlyProblemCharacteristics = problemCharacteristics.AsReadOnly(); 123 126 problem = new SingleObjectiveOKBProblem(); 124 127 algorithmId2RunMapping = new BidirectionalLookup<long, IRun>(); … … 149 152 knowledgeBase.ItemsAdded += InformationChanged; 150 153 knowledgeBase.ItemsRemoved += InformationChanged; 154 problemCharacteristics.ItemsAdded += CharacteristicChanged; 155 problemCharacteristics.ItemsReplaced += CharacteristicChanged; 156 problemCharacteristics.ItemsRemoved += CharacteristicChanged; 157 problemCharacteristics.CollectionReset += CharacteristicChanged; 158 problemCharacteristics.CheckedItemsChanged += CharacteristicChanged; 151 159 } 152 160 … … 168 176 } 169 177 178 private void CharacteristicChanged(object sender, EventArgs e) { 179 if (SuppressEvents) return; 180 UpdateInstanceProjection(); 181 } 182 170 183 public bool IsCurrentInstance(IRun run) { 171 184 if (!problemId2ProblemInstanceMapping.ContainsSecond(run)) return false; … … 177 190 178 191 var instances = new Dictionary<IRun, double[]>(); 192 var values = new List<double>[ProblemCharacteristics.CheckedItems.Count()]; 179 193 foreach (var run in ProblemInstances) { 180 194 var f = 0; 181 195 instances[run] = new double[ProblemCharacteristics.CheckedItems.Count()]; 182 196 foreach (var c in ProblemCharacteristics.CheckedItems.Select(x => x.Value.Value)) { 197 if (values[f] == null) values[f] = new List<double>(ProblemInstances.Count); 183 198 IItem item; 184 199 if (run.Results.TryGetValue(c, out item)) { 185 instances[run][f] = (double)((dynamic)item).Value; 186 } else instances[run][f] = 0; // TODO: handle missing values 200 var val = (double)((dynamic)item).Value; 201 if (!double.IsNaN(val)) values[f].Add(val); 202 instances[run][f] = val; 203 } else instances[run][f] = double.NaN; 187 204 f++; 188 205 } 189 206 } 190 191 var allValues = instances.SelectMany(x => x.Value).ToList(); 192 var avg = allValues.Average(); 193 var stdev = allValues.StandardDeviation(); 207 var median = values.Select(x => x.Count == 0 ? 0.0 : x.Median()).ToList(); 208 209 var allValues = instances.Values.Select(x => x.Select((f, i) => new { Idx = i, Val = double.IsNaN(f) ? median[i] : f }).ToList()) 210 .SelectMany(x => x) 211 .GroupBy(x => x.Idx, x => x.Val) 212 .OrderBy(x => x.Key).ToList(); 213 var avg = allValues.Select(x => x.Average()).ToList(); 214 var stdev = allValues.Select(x => x.StandardDeviation()).ToList(); 194 215 195 216 // normalize characteristic values by transforming them to their z-score … … 197 218 var arr = instances[key]; 198 219 for (var i = 0; i < arr.Length; i++) { 199 arr[i] = (arr[i] - avg) / stdev; 220 if (double.IsNaN(arr[i])) arr[i] = median[i]; 221 if (stdev[i] > 0) arr[i] = (arr[i] - avg[i]) / stdev[i]; 200 222 } 201 223 } … … 396 418 var adminClient = Clients.OKB.Administration.AdministrationClient.Instance; 397 419 try { 398 progress.Status = " Downloading run information...";420 progress.Status = "Connecting to OKB..."; 399 421 progress.ProgressValue = 0; 400 422 // FIXME: How to tell if refresh is necessary? … … 414 436 progress.Status = "Downloading problem instances..."; 415 437 progress.ProgressValue = 0; 416 var p = 0;438 int[] p = { 0 }; 417 439 ProblemInstances.UpdateOfRunsInProgress = true; 418 440 ProblemInstances.Clear(); 419 441 var characteristics = new HashSet<string>(); 420 442 var totalProblems = adminClient.Problems.Count(x => x.ProblemClassId == probClassId); 421 foreach (var problInst in adminClient.Problems.Where(x => x.ProblemClassId == probClassId)) { 422 progress.Status = string.Format("Downloading problem {0} (okb-id: {1})....", problInst.Name, problInst.Id); 423 var data = Clients.OKB.Administration.AdministrationClient.GetProblemData(problInst.Id); 443 Parallel.ForEach(adminClient.Problems.Where(x => x.ProblemClassId == probClassId), (pInst) => { 444 var charas = new List<string>(); 445 IRun probRun = null; 446 var data = Clients.OKB.Administration.AdministrationClient.GetProblemData(pInst.Id); 424 447 if (data != null) { 425 448 using (var stream = new MemoryStream(data)) { 426 449 try { 427 450 var prob = (IProblem)XmlParser.Deserialize<IContent>(stream); 428 varprobRun = new Run() { Name = prob.Name };451 probRun = new Run() { Name = prob.Name }; 429 452 prob.CollectParameterValues(probRun.Parameters); 430 453 probRun.Parameters["Problem Name"] = new StringValue(prob.Name); 431 454 probRun.Parameters["Problem Type"] = new StringValue(prob.GetType().Name); 432 progress.Status += Environment.NewLine + "Downloading characteristics..."; 433 foreach (var v in RunCreationClient.Instance.GetCharacteristicValues(problInst.Id)) { 455 foreach (var v in RunCreationClient.Instance.GetCharacteristicValues(pInst.Id)) { 434 456 probRun.Results.Add("Characteristic." + v.Name, RunCreationClient.Instance.ConvertToItem(v)); 435 chara cteristics.Add(v.Name);457 charas.Add("Characteristic." + v.Name); 436 458 } 437 ProblemInstances.Add(probRun);438 problemId2ProblemInstanceMapping.Add(problInst.Id, probRun);439 459 } catch { } 440 460 stream.Close(); 441 461 } 442 } 443 p++; 444 progress.ProgressValue = p / (double)totalProblems; 445 } 462 if (probRun != null) { 463 lock (characteristics) { 464 problemId2ProblemInstanceMapping.Add(pInst.Id, probRun); 465 ProblemInstances.Add(probRun); 466 progress.Status = string.Format("Downloaded problem {0} (okb-id: {1})....", pInst.Name, pInst.Id); 467 p[0]++; 468 progress.ProgressValue = p[0] / (double)totalProblems; 469 foreach (var c in charas) characteristics.Add(c); 470 } 471 } 472 } 473 }); 446 474 447 475 algorithmId2AlgorithmInstanceMapping.Clear(); 448 476 progress.Status = "Downloading algorithm instances..."; 449 477 progress.ProgressValue = 0; 450 p = 0;451 foreach (var algInst in adminClient.Algorithms){452 progress.Status = string.Format("Downloading algorithm {0} (okb-id: {1})...", algInst.Name, algInst.Id);478 p[0] = 0; 479 Parallel.ForEach(adminClient.Algorithms, (algInst) => { 480 IAlgorithm alg = null; 453 481 var data = Clients.OKB.Administration.AdministrationClient.GetAlgorithmData(algInst.Id); 454 482 if (data != null) { 455 483 using (var stream = new MemoryStream(data)) { 456 484 try { 457 var alg = (IAlgorithm)XmlParser.Deserialize<IContent>(stream); 458 algorithmId2AlgorithmInstanceMapping.Add(algInst.Id, alg); 485 alg = (IAlgorithm)XmlParser.Deserialize<IContent>(stream); 459 486 } catch { } 460 487 stream.Close(); 461 488 } 462 } 463 p++; 464 progress.ProgressValue = p / (double)adminClient.Algorithms.Count; 465 } 489 if (alg != null) { 490 lock (algorithmId2AlgorithmInstanceMapping) { 491 algorithmId2AlgorithmInstanceMapping.Add(algInst.Id, alg); 492 progress.Status = string.Format("Downloaded algorithm {0} (okb-id: {1})...", algInst.Name, algInst.Id); 493 p[0]++; 494 progress.ProgressValue = p[0] / (double)adminClient.Algorithms.Count; 495 } 496 } 497 } 498 }); 466 499 467 500 var interestingValues = queryClient.ValueNames.Where(x => InterestingValueNames.Contains(x.Name)).ToList(); 468 501 469 progress.Status = " Obtaining number ofruns...";502 progress.Status = "Downloading runs..."; 470 503 progress.ProgressValue = 0; 471 p = 0;504 p[0] = 0; 472 505 var count = queryClient.GetNumberOfRuns(problemClassFilter); 473 506 if (count == 0) return; 474 507 508 var runList = new List<IRun>(); 475 509 var runIds = queryClient.GetRunIds(problemClassFilter).ToList(); 476 var conversions = new List<Task>(); 477 var runList = new List<IRun>(); 478 while (p < count) { 479 var nextIds = runIds.Skip(p).Take(500).ToList(); 480 progress.Status = string.Format("Downloading runs {0} to {1} of {2}...", p, p + nextIds.Count, count); 481 var okbRuns = queryClient.GetRunsWithValues(nextIds, true, interestingValues); 482 conversions.Add(Task.Factory.StartNew(() => { 483 var hlRuns = okbRuns.AsParallel().Select(x => new { AlgorithmId = x.Algorithm.Id, Run = queryClient.ConvertToOptimizationRun(x) }).ToList(); 484 lock (runList) { 485 foreach (var r in hlRuns) { 486 algorithmId2RunMapping.Add(r.AlgorithmId, r.Run); 487 runList.Add(r.Run); 488 } 489 } 490 })); 491 p += nextIds.Count; 492 progress.ProgressValue = p / (double)count; 493 } 494 Task.WaitAll(conversions.ToArray()); 510 var batches = runIds.Select((v, i) => new { Idx = i, Val = v }).GroupBy(x => x.Idx / 500, x => x.Val); 511 Parallel.ForEach(batches.Select(x => x.ToList()), (batch) => { 512 var okbRuns = queryClient.GetRunsWithValues(batch, true, interestingValues); 513 var hlRuns = okbRuns.AsParallel().Select(x => new { AlgorithmId = x.Algorithm.Id, Run = queryClient.ConvertToOptimizationRun(x) }).ToList(); 514 lock (runList) { 515 foreach (var r in hlRuns) { 516 algorithmId2RunMapping.Add(r.AlgorithmId, r.Run); 517 runList.Add(r.Run); 518 } 519 progress.Status = string.Format("Downloaded runs {0} to {1} of {2}...", p[0], p[0] + batch.Count, count); 520 p[0] += batch.Count; 521 progress.ProgressValue = p[0] / (double)count; 522 } 523 }); 495 524 496 525 progress.Status = "Finishing..."; … … 534 563 } 535 564 } 536 ProblemCharacteristics.Replace(characteristics.Select(x => new StringValue(x))); 565 try { 566 SuppressEvents = true; 567 problemCharacteristics.Replace(characteristics.Select(x => new StringValue(x))); 568 foreach (var pc in problemCharacteristics.Where(x => !x.Value.StartsWith("Characteristic."))) 569 problemCharacteristics.SetItemCheckedState(pc, false); 570 } finally { SuppressEvents = false; } 537 571 try { 538 572 KnowledgeBase.UpdateOfRunsInProgress = true;
Note: See TracChangeset
for help on using the changeset viewer.