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);
        }
    }
Пример #2
0
        /// <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));
        }
Пример #3
0
    /// <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);
    }