Beispiel #1
0
 /// <summary>
 /// Retrieves attributes values of given subsequences from database.
 /// </summary>
 /// <param name="subsequenceIds">
 /// Ids of subsequences which attributes values are to be retrieved.
 /// </param>
 /// <returns>
 /// Dictionary containing subsequences ids as keys and attributes values as values.
 /// </returns>
 private Dictionary <long, AttributeValue[]> GetSubsequencesAttributesValues(long[] subsequenceIds)
 {
     using (var db = new LibiadaWebEntities())
     {
         var sequenceAttributeRepository = new SequenceAttributeRepository(db);
         return(sequenceAttributeRepository.GetAttributes(subsequenceIds));
     }
 }
Beispiel #2
0
        public ActionResult Index(
            long[] matterIds,
            short characteristicLinkId,
            Notation notation,
            Feature[] features,
            string maxDifference,
            string excludeType)
        {
            return(CreateTask(() =>
            {
                if (matterIds.Length != 2)
                {
                    throw new ArgumentException("Count of selected matters must be 2.", nameof(matterIds));
                }

                long firstMatterId = matterIds[0];
                long firstParentSequenceId = db.CommonSequence.Single(c => c.MatterId == firstMatterId && c.Notation == notation).Id;
                SubsequenceData[] firstSequenceSubsequences = CalculateSubsequencesCharacteristics(
                    new[] { characteristicLinkId },
                    features,
                    firstParentSequenceId);
                List <double> firstSequenceCharacteristics = firstSequenceSubsequences.Select(s => s.CharacteristicsValues[0]).ToList();
                Dictionary <long, AttributeValue[]> firstDbSubsequencesAttributes = sequenceAttributeRepository.GetAttributes(firstSequenceSubsequences.Select(s => s.Id));
                var firstSequenceAttributes = new List <AttributeValue[]>();
                foreach (SubsequenceData subsequence in firstSequenceSubsequences)
                {
                    firstDbSubsequencesAttributes.TryGetValue(subsequence.Id, out AttributeValue[] attributes);
                    attributes = attributes ?? new AttributeValue[0];
                    firstSequenceAttributes.Add(attributes);
                }

                long secondMatterId = matterIds[1];
                long secondParentSequenceId = db.CommonSequence.Single(c => c.MatterId == secondMatterId && c.Notation == notation).Id;
                SubsequenceData[] secondSequenceSubsequences = CalculateSubsequencesCharacteristics(
                    new[] { characteristicLinkId },
                    features,
                    secondParentSequenceId);
                List <double> secondSequenceCharacteristics = secondSequenceSubsequences.Select(s => s.CharacteristicsValues[0]).ToList();
                Dictionary <long, AttributeValue[]> secondDbSubsequencesAttributes = sequenceAttributeRepository.GetAttributes(secondSequenceSubsequences.Select(s => s.Id));
                var secondSequenceAttributes = new List <AttributeValue[]>();
                foreach (SubsequenceData subsequence in secondSequenceSubsequences)
                {
                    secondDbSubsequencesAttributes.TryGetValue(subsequence.Id, out AttributeValue[] attributes);
                    attributes = attributes ?? new AttributeValue[0];
                    secondSequenceAttributes.Add(attributes);
                }

                double difference = double.Parse(maxDifference, CultureInfo.InvariantCulture);

                var similarSubsequences = new List <(int, int)>();

                for (int i = 0; i < firstSequenceCharacteristics.Count; i++)
                {
                    for (int j = 0; j < secondSequenceCharacteristics.Count; j++)
                    {
                        if (Math.Abs(firstSequenceCharacteristics[i] - secondSequenceCharacteristics[j]) <= difference)
                        {
                            similarSubsequences.Add((i, j));

                            if (excludeType == "Exclude")
                            {
                                firstSequenceCharacteristics[i] = double.NaN;
                                secondSequenceCharacteristics[j] = double.NaN;
                            }
                        }
                    }
                }

                var characteristicName = characteristicTypeLinkRepository.GetCharacteristicName(characteristicLinkId, notation);

                var similarity = similarSubsequences.Count * 200d / (firstSequenceSubsequences.Length + secondSequenceSubsequences.Length);

                var firstSequenceSimilarity = similarSubsequences.Count * 100d / firstSequenceSubsequences.Length;

                var secondSequenceSimilarity = similarSubsequences.Count * 100d / secondSequenceSubsequences.Length;

                var result = new Dictionary <string, object>
                {
                    { "firstSequenceName", Cache.GetInstance().Matters.Single(m => m.Id == firstMatterId).Name },
                    { "secondSequenceName", Cache.GetInstance().Matters.Single(m => m.Id == secondMatterId).Name },
                    { "characteristicName", characteristicName },
                    { "similarSubsequences", similarSubsequences },
                    { "similarity", similarity },
                    { "features", features.ToDictionary(f => (byte)f, f => f.GetDisplayValue()) },
                    { "firstSequenceSimilarity", firstSequenceSimilarity },
                    { "secondSequenceSimilarity", secondSequenceSimilarity },
                    { "firstSequenceSubsequences", firstSequenceSubsequences },
                    { "secondSequenceSubsequences", secondSequenceSubsequences },
                    { "firstSequenceAttributes", firstSequenceAttributes },
                    { "secondSequenceAttributes", secondSequenceAttributes }
                };

                string json = JsonConvert.SerializeObject(result);

                return new Dictionary <string, string> {
                    { "data", json }
                };
            }));
        }