public CongenericChain ( IBaseObject baseObject ) : |
||
baseObject | IBaseObject | /// Element of congeneric chain. /// |
return |
/// <summary> /// The create. /// </summary> /// <param name="source"> /// The source. /// </param> /// <param name="link"> /// The link. /// </param> /// <returns> /// The <see cref="Chain"/>. /// </returns> /// <exception cref="ArgumentException"> /// Thrown if link is unacceptable. /// </exception> public static Chain Create(Chain source, Link link) { if (link != Link.Start && link != Link.End && link != Link.CycleEnd && link != Link.CycleStart) { throw new ArgumentException("Unknown link", "link"); } var result = new Chain(source.GetLength()); Alphabet sourceAlphabet = source.Alphabet; var entries = new int[sourceAlphabet.Cardinality]; var intervals = new int[sourceAlphabet.Cardinality][]; for (int j = 0; j < sourceAlphabet.Cardinality; j++) { var intervalsManager = new CongenericIntervalsManager(source.CongenericChain(j)); intervals[j] = intervalsManager.GetIntervals(link); } for (int i = 0; i < source.GetLength(); i++) { var elementIndex = sourceAlphabet.IndexOf(source[i]); int entry = entries[elementIndex]++; var interval = intervals[elementIndex][entry]; result.Set(new ValueInt(interval), i); } return result; }
/// <summary> /// The is valid. /// </summary> /// <param name="building"> /// The building. /// </param> /// <returns> /// true if /// </returns> public bool IsValid(string building) { var chain = new Chain(building); var countCalculator = new ElementsCount(); var firstCount = (int)countCalculator.Calculate(chain.CongenericChain(0), Link.Start); for (int i = 1; i < chain.Alphabet.Cardinality; i++) { if (firstCount != (int)countCalculator.Calculate(chain.CongenericChain(i), Link.Start)) { return false; } } return true; }
/// <summary> /// The frequency characteristic. /// </summary> /// <param name="characteristicTypeLinkId"> /// The characteristic type and link id. /// </param> /// <param name="frequencyCount"> /// The frequency count. /// </param> /// <param name="chain"> /// The chain. /// </param> /// <param name="sequenceId"> /// The sequence id. /// </param> /// <param name="calculator"> /// The calculator. /// </param> /// <param name="link"> /// The link. /// </param> private void FrequencyCharacteristic(int characteristicTypeLinkId, int frequencyCount, Chain chain, long sequenceId, IBinaryCalculator calculator, Link link) { List<long> sequenceElements = DbHelper.GetElementIds(db, sequenceId); var newCharacteristics = new List<BinaryCharacteristic>(); var databaseCharacteristics = db.BinaryCharacteristic.Where(b => b.SequenceId == sequenceId && b.CharacteristicTypeLinkId == characteristicTypeLinkId).ToArray(); // calculating frequencies of elements in alphabet var frequencies = new List<KeyValuePair<IBaseObject, double>>(); for (int f = 0; f < chain.Alphabet.Cardinality; f++) { var probabilityCalculator = new Probability(); var result = probabilityCalculator.Calculate(chain.CongenericChain(f), Link.NotApplied); frequencies.Add(new KeyValuePair<IBaseObject, double>(chain.Alphabet[f], result)); } // ordering alphabet by frequencies SortKeyValuePairList(frequencies); // calculating relation characteristic only for elements with maximum frequency for (int i = 0; i < frequencyCount; i++) { for (int j = 0; j < frequencyCount; j++) { int firstElementNumber = chain.Alphabet.IndexOf(frequencies[i].Key) + 1; int secondElementNumber = chain.Alphabet.IndexOf(frequencies[j].Key) + 1; long firstElementId = sequenceElements[firstElementNumber]; long secondElementId = sequenceElements[secondElementNumber]; // searching characteristic in database if (!databaseCharacteristics.Any(b => b.FirstElementId == firstElementId && b.SecondElementId == secondElementId)) { double result = calculator.Calculate(chain.GetRelationIntervalsManager(i + 1, j + 1), link); newCharacteristics.Add(binaryCharacteristicRepository.CreateBinaryCharacteristic(sequenceId, characteristicTypeLinkId, firstElementId, secondElementId, result)); } } } db.BinaryCharacteristic.AddRange(newCharacteristics); db.SaveChanges(); }