public IEnumerable <KeyValuePair <string, string> > AlignedSequence() { var rmIncr = 0; var seq1Incr = 0; var seq2Incr = 0; var resultMatrix = new List <KeyValuePair <string, string> >(); TracebackPath.Reverse(); foreach (var tracebackItem in TracebackPath) { if (tracebackItem == Move.DiagonalMove) // match { resultMatrix.Add(new KeyValuePair <string, string>( Sequence1[seq1Incr].ToString(), Sequence2[seq2Incr].ToString())); seq1Incr++; seq2Incr++; } else if (tracebackItem == Move.VerticalMove) { resultMatrix.Add(new KeyValuePair <string, string>( "-", Sequence2[seq2Incr].ToString())); seq2Incr++; } else { resultMatrix.Add(new KeyValuePair <string, string>( Sequence1[seq1Incr].ToString(), "-")); seq1Incr++; } rmIncr++; } return(resultMatrix); }
public Coordinates Traceback(Coordinates coordinates) { if (coordinates.X > 0 || coordinates.Y > 0) { if (coordinates.Y == 0) // must be horizontal as we are on the top row { TracebackPath.Add(Move.HorizontalMove); return(Traceback(HorizontalMoveCoordinates(coordinates.X, coordinates.Y))); } if (coordinates.X == 0) // must be vertical as we are on left most column { TracebackPath.Add(Move.VerticalMove); return(Traceback(VerticalMoveCoordinates(coordinates.X, coordinates.Y))); } var verticalValue = VerticalMoveValue(coordinates.X, coordinates.Y); var diagonalValue = DiagonalMoveValue(coordinates.X, coordinates.Y); var horizontalValue = HorizontalMoveValue(coordinates.X, coordinates.Y); var currentValue = Grid.GetValue(coordinates.X, coordinates.Y); if (currentValue == diagonalValue) { TracebackPath.Add(Move.DiagonalMove); return(Traceback(DiagonalMoveCoordinates(coordinates.X, coordinates.Y))); } //get rid of ones that do not differ by one verticalValue = FindDifference(verticalValue, currentValue); diagonalValue = FindDifference(diagonalValue, currentValue); horizontalValue = FindDifference(horizontalValue, currentValue); if (diagonalValue >= horizontalValue && diagonalValue >= verticalValue) { TracebackPath.Add(Move.DiagonalMove); return(Traceback(DiagonalMoveCoordinates(coordinates.X, coordinates.Y))); } if (verticalValue >= horizontalValue && verticalValue >= diagonalValue) { TracebackPath.Add(Move.VerticalMove); return(Traceback(VerticalMoveCoordinates(coordinates.X, coordinates.Y))); } else { TracebackPath.Add(Move.HorizontalMove); return(Traceback(HorizontalMoveCoordinates(coordinates.X, coordinates.Y))); } } return(new Coordinates(0, 0)); }