/// <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)); } }
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 } }; })); }