/// <summary> /// Reorganizes source chain. /// </summary> /// <param name="source"> /// Source chain. /// </param> /// <returns> /// <see cref="AbstractChain"/>. /// </returns> /// <exception cref="InvalidOperationException"> /// Thrown if level is less than 0. /// </exception> public override AbstractChain Reorganize(AbstractChain source) { if (level < 0) { throw new InvalidOperationException("Markov chain level can't be less than 0"); } if (level == 0) { return source; } var result = new BaseChain(); result.ClearAndSetNewLength(source.GetLength() + level); for (int i = 0; i < source.GetLength(); i++) { result[i] = source[i]; } var iterator = new IteratorStart(source, level, 1); iterator.Reset(); iterator.Next(); AbstractChain addition = iterator.Current(); for (int i = 0; i < addition.GetLength(); i++) { result[source.GetLength() + i] = addition[i]; } return result; }
/// <summary> /// Reorganizes <see cref="AbstractChain"/> into <see cref="AbstractChain"/>. /// </summary> /// <param name="source"> /// Source chain. /// </param> /// <returns> /// The <see cref="AbstractChain"/>. /// </returns> public override AbstractChain Reorganize(AbstractChain source) { var result = source.Clone() as AbstractChain; if (result != null) { return result; } result = new BaseChain(); result.ClearAndSetNewLength(source.GetLength()); var iteratorRead = new IteratorSimpleStart(source, 1); var iteratorWrite = new IteratorWritableStart(result); iteratorRead.Reset(); iteratorWrite.Reset(); iteratorRead.Next(); iteratorWrite.Next(); for (int i = 0; i < source.GetLength(); i++) { iteratorWrite.WriteValue(iteratorRead.Current()); iteratorRead.Next(); iteratorWrite.Next(); } return result; }
/// <summary> /// Reorganizes <see cref="AbstractChain"/> into <see cref="AbstractChain"/>. /// </summary> /// <param name="source"> /// Source chain. /// </param> /// <returns> /// The <see cref="AbstractChain"/>. /// </returns> public override AbstractChain Reorganize(AbstractChain source) { var resent = new BaseChain(); resent.ClearAndSetNewLength(source.GetLength()); for (int i = 0; i < source.GetLength(); i++) { var phantom = source[i] as ValuePhantom; resent.Set(phantom != null ? phantom[0] : source[i], i); } return resent; }
/// <summary> /// Generates sequence. /// </summary> /// <param name="length"> /// Length of generated sequence. /// </param> /// <param name="chainRank"> /// Rank of used markov chain. /// </param> /// <returns> /// Generated sequence as <see cref="BaseChain"/>. /// </returns> public override BaseChain Generate(int length, int chainRank) { var temp = new BaseChain(); temp.ClearAndSetNewLength(length); var read = Rank > 1 ? new IteratorStart(temp, Rank - 1, 1) : null; var write = new IteratorWritableStart(temp); if (read != null) { read.Reset(); read.Next(); } write.Reset(); Generator.Reset(); int m = 0; for (int j = 0; j < length; j++) { if (m == HeterogeneityRank + 1) { m = 0; } m += 1; write.Next(); if (j >= Rank) { if (read != null) { read.Next(); } } if (read != null) { BaseChain chain = (BaseChain)read.Current(); var indexedChain = new int[chain.GetLength()]; for (int k = 0; k < chain.GetLength(); k++) { indexedChain[k] = Alphabet.IndexOf(chain[k]); } write.WriteValue(GetObject(ProbabilityMatrixes[m - 1].GetProbabilityVector(Alphabet, indexedChain))); } } return temp; }
/// <summary> /// Returns current value of iterator. /// </summary> /// <returns> /// Current subsequence. /// </returns> /// <exception cref="InvalidOperationException"> /// Thrown if current position is invalid. /// </exception> public virtual AbstractChain Current() { if (Position < 0 || Position > MaxPosition) { throw new InvalidOperationException("Iterator position is out of range."); } var result = new BaseChain(); result.ClearAndSetNewLength(Length); for (int i = 0; i < Length; i++) { result[i] = Source[Position + i]; } return result; }