private void OnLeaderboardDataResponse(GameSparks.Api.Responses.LeaderboardDataResponse response) { if (response.HasErrors == true) { Debug.LogError(response.Errors.JSON); } else { List <DistanceEntry> entries = new List <DistanceEntry> (); foreach (var item in response.Data) { DistanceEntry entry = JsonUtility.FromJson <DistanceEntry>(item.JSONString); entries.Add(entry); } ReturnLeaderboardEntries(entries); } }
/// <typeparam name="T"></typeparam> /// <param name="list">unsorted list of elements</param> /// <param name="count">how many closest elements to get</param> /// <param name="DistanceFunction">heuristic to determine how close an element is</param> /// <param name="sorted">if true, minor additional process cost (another O(c log c) function) un-heaping, to sort</param> /// <returns>a list of count elements if list length is greater count. these are the closest to 0 according to the given distance heuristic. if sorted is false, they are not in gauranteed order.</returns> public static T[] GetClosest <T>(this IEnumerable <T> list, int count, Func <T, float> DistanceFunction, bool sorted = true) { List <T> result = new List <T>(); Comparer <DistanceEntry <T> > comparer = Comparer <DistanceEntry <T> > .Create((a, b) => a.distance.CompareTo(b.distance)); MaxHeap <DistanceEntry <T> > maxheap = new MaxHeap <DistanceEntry <T> >(comparer); foreach (T e in list) { DistanceEntry <T> de = new DistanceEntry <T>(e, DistanceFunction(e)); maxheap.Add(de); if (maxheap.Count > count) { maxheap.Pop(); } } return(sorted ? maxheap.ToSortedArray(sortedElement => sortedElement.value) : maxheap.ToArray(partiallySortedElement => partiallySortedElement.value)); }
/// <summary> /// This method calculates the edit distances for all selected subjects /// scanpath with the current settings and populates the data grid views /// with the Loci and Sequence similarity matrices. /// </summary> private void RefillDistancesTable() { // Clear Existing Rows and Columns this.dgvLociSimilarity.Rows.Clear(); this.dgvLociSimilarity.Columns.Clear(); this.dgvSequenceSimilarity.Rows.Clear(); this.dgvSequenceSimilarity.Columns.Clear(); if (!this.calcDistances) { return; } // Skip if no data available if (this.scanpathsPicture.GazeFixations == null) { return; } if (this.aggregateDistancesByCategory) { var categories = new List<string>(); // Create loci similarity matrix int rows = this.selectedSubjects.Count; Array lociSimilarities = new DistanceEntry[rows, rows]; Array globalSimilarities = new DistanceEntry[rows, rows]; DataTable fixations = this.scanpathsPicture.GazeFixations; var fixationsView = new DataView( fixations, string.Empty, "CountInTrial", DataViewRowState.CurrentRows); DataTable mainTable = Document.ActiveDocument.DocDataSet.SubjectsAdapter.GetData(); foreach (DataRow row in mainTable.Rows) { string entry = row["Category"].ToString(); if (entry == string.Empty || entry == " ") { entry = "no category"; } if (!categories.Contains(entry)) { categories.Add(entry); } } int rowCounter = 0; foreach (KeyValuePair<string, ScanpathProperties> subjectRowKVP in this.selectedSubjects) { int columnCounter = 0; ////DataView fixationsOfS = new DataView( //// fixations, //// "(SubjectName='" + subjectRowKVP.Value.SubjectName + "')", //// "CountInTrial", //// DataViewRowState.CurrentRows); foreach (KeyValuePair<string, ScanpathProperties> subjectColumnKVP in this.selectedSubjects) { ////DataView fixationsOfT = new DataView( //// fixations, //// "(SubjectName='" + subjectColumnKVP.Value.SubjectName + "')", //// "CountInTrial", //// DataViewRowState.CurrentRows); ////float malsburgSimilarity = EditDistance.MalsburgDistance(sFixations, tFixations, 0.5f); List<string> rowStringList = GetStringListForExtendedString(subjectRowKVP.Value.ScanpathString); List<string> columnStringList = GetStringListForExtendedString(subjectColumnKVP.Value.ScanpathString); float localSimilarity = EditDistance.CharacterSimilarityExtended( rowStringList, columnStringList) * 100; float globalSimilarity = EditDistance.SequenceSimilarityExtended( rowStringList, columnStringList) * 100; lociSimilarities.SetValue( new DistanceEntry( categories.IndexOf(subjectRowKVP.Value.SubjectCategory), categories.IndexOf(subjectColumnKVP.Value.SubjectCategory), localSimilarity), rowCounter, columnCounter); globalSimilarities.SetValue( new DistanceEntry( categories.IndexOf(subjectRowKVP.Value.SubjectCategory), categories.IndexOf(subjectColumnKVP.Value.SubjectCategory), globalSimilarity), rowCounter, columnCounter); columnCounter++; } rowCounter++; } int mergedRows = categories.Count; Array mergedLociSimilarities = new CategoryEntry[mergedRows, mergedRows]; Array mergedGlobalSimilarities = new CategoryEntry[mergedRows, mergedRows]; // Merge categories for (int i = 0; i <= lociSimilarities.GetUpperBound(0); i++) { for (int j = 0; j <= lociSimilarities.GetUpperBound(1); j++) { // Only take values above the diagonal if (i >= j) { continue; } DistanceEntry currentLociValue = (DistanceEntry)lociSimilarities.GetValue(i, j); CategoryEntry currentCategoryValue = (CategoryEntry)mergedLociSimilarities.GetValue(currentLociValue.RowCategory, currentLociValue.ColumnCategory); currentCategoryValue.Divisor++; CategoryEntry newCategoryValue = new CategoryEntry(currentCategoryValue.Divisor, currentLociValue.DistanceValue + currentCategoryValue.DistanceValue); mergedLociSimilarities.SetValue(newCategoryValue, currentLociValue.RowCategory, currentLociValue.ColumnCategory); mergedLociSimilarities.SetValue(newCategoryValue, currentLociValue.ColumnCategory, currentLociValue.RowCategory); DistanceEntry currentGlobalValue = (DistanceEntry)globalSimilarities.GetValue(i, j); CategoryEntry currentGlobalCategoryValue = (CategoryEntry)mergedGlobalSimilarities.GetValue(currentGlobalValue.RowCategory, currentGlobalValue.ColumnCategory); currentGlobalCategoryValue.Divisor++; CategoryEntry newGlobalCategoryValue = new CategoryEntry(currentGlobalCategoryValue.Divisor, currentGlobalValue.DistanceValue + currentGlobalCategoryValue.DistanceValue); mergedGlobalSimilarities.SetValue(newGlobalCategoryValue, currentGlobalValue.RowCategory, currentGlobalValue.ColumnCategory); mergedGlobalSimilarities.SetValue(newGlobalCategoryValue, currentGlobalValue.ColumnCategory, currentGlobalValue.RowCategory); } } this.dgvLociSimilarity.Columns.Add("columnLociSubjects", "Loci Similarity"); this.dgvSequenceSimilarity.Columns.Add("columnSequenceSubjects", "Sequence Similarity"); foreach (string category in categories) { this.dgvLociSimilarity.Columns.Add(category, category); this.dgvSequenceSimilarity.Columns.Add(category, category); } // Ouput category distances for (int i = 0; i <= mergedLociSimilarities.GetUpperBound(0); i++) { var lociSimilarity = new List<object>(); var sequenceSimilarity = new List<object>(); for (int j = 0; j <= mergedLociSimilarities.GetUpperBound(1); j++) { CategoryEntry currentCategoryValue = (CategoryEntry)mergedLociSimilarities.GetValue(i, j); lociSimilarity.Add(currentCategoryValue.DistanceValue / currentCategoryValue.Divisor); CategoryEntry currentGlobalCategoryValue = (CategoryEntry)mergedGlobalSimilarities.GetValue(i, j); sequenceSimilarity.Add(currentGlobalCategoryValue.DistanceValue / currentGlobalCategoryValue.Divisor); } var lociColumns = new List<object> { categories[i] }; lociColumns.AddRange(lociSimilarity.ToArray()); this.dgvLociSimilarity.Rows.Add(lociColumns.ToArray()); var sequenceColumns = new List<object> { categories[i] }; sequenceColumns.AddRange(sequenceSimilarity.ToArray()); this.dgvSequenceSimilarity.Rows.Add(sequenceColumns.ToArray()); } } else { this.dgvLociSimilarity.Columns.Add("columnLociSubjects", "Loci Similarity"); this.dgvSequenceSimilarity.Columns.Add("columnSequenceSubjects", "Sequence Similarity"); foreach (string subject in this.selectedSubjects.Keys) { this.dgvLociSimilarity.Columns.Add(subject, subject); this.dgvSequenceSimilarity.Columns.Add(subject, subject); } this.dgvLociSimilarity.Columns.Add("columnLociString", "Scanpath string"); this.dgvSequenceSimilarity.Columns.Add("columnSequenceString", "Scanpath string"); this.dgvLociSimilarity.Columns.Add("columnLociSubjectGroup", "Subject Group"); this.dgvSequenceSimilarity.Columns.Add("columnSequenceSubjectGroup", "Subject Group"); DataTable fixations = this.scanpathsPicture.GazeFixations; ////DataView fixationsView = new DataView( //// fixations, //// string.Empty, //// "CountInTrial", //// DataViewRowState.CurrentRows); foreach (KeyValuePair<string, ScanpathProperties> subjectRowKVP in this.selectedSubjects) { var lociSimilarity = new List<object>(); var sequenceSimilarity = new List<object>(); ////DataView fixationsOfS = new DataView( //// fixations, //// "(SubjectName='" + subjectRowKVP.Value.SubjectName + "')", //// "CountInTrial", //// DataViewRowState.CurrentRows); foreach (KeyValuePair<string, ScanpathProperties> subjectColumnKVP in this.selectedSubjects) { ////DataView fixationsOfT = new DataView( //// fixations, //// "(SubjectName='" + subjectColumnKVP.Value.SubjectName + "')", //// "CountInTrial", //// DataViewRowState.CurrentRows); ////float malsburgSimilarity = EditDistance.MalsburgDistance(sFixations, tFixations, 0.5f); List<string> rowStringList = GetStringListForExtendedString(subjectRowKVP.Value.ScanpathString); List<string> columnStringList = GetStringListForExtendedString(subjectColumnKVP.Value.ScanpathString); float localSimilarity = EditDistance.CharacterSimilarityExtended( rowStringList, columnStringList) * 100; float globalSimilarity = EditDistance.SequenceSimilarityExtended( rowStringList, columnStringList) * 100; lociSimilarity.Add(localSimilarity.ToString("N0") + " %"); sequenceSimilarity.Add(globalSimilarity.ToString("N0") + " %"); } var lociColumns = new List<object>(); lociColumns.Add(subjectRowKVP.Value.SubjectName); lociColumns.AddRange(lociSimilarity.ToArray()); lociColumns.Add(subjectRowKVP.Value.ScanpathString); lociColumns.Add(subjectRowKVP.Value.SubjectCategory); this.dgvLociSimilarity.Rows.Add(lociColumns.ToArray()); var sequenceColumns = new List<object>(); sequenceColumns.Add(subjectRowKVP.Value.SubjectName); sequenceColumns.AddRange(sequenceSimilarity.ToArray()); sequenceColumns.Add(subjectRowKVP.Value.ScanpathString); sequenceColumns.Add(subjectRowKVP.Value.SubjectCategory); this.dgvSequenceSimilarity.Rows.Add(sequenceColumns.ToArray()); } } this.dgvLociSimilarity.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.DisplayedCells); this.dgvSequenceSimilarity.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.DisplayedCells); }