public void SemiGlobalAlign()
        {
            var scorer = new StringScorer();
            var msa    = new PairwiseAlignmentAlgorithm <string, char>(scorer, "car", "bar", GetChars)
            {
                Mode = AlignmentMode.SemiGlobal
            };

            msa.Compute();
            Alignment <string, char>[] alignments = msa.GetAlignments().ToArray();

            Assert.That(alignments.Length, Is.EqualTo(1));
            AssertAlignmentsEqual(alignments[0], CreateAlignment(
                                      "| c a r |",
                                      "| b a r |"
                                      ));
            Assert.That(alignments[0].NormalizedScore, Is.EqualTo(0.66).Within(0.01));

            msa = new PairwiseAlignmentAlgorithm <string, char>(scorer, "cart", "bar", GetChars)
            {
                Mode = AlignmentMode.SemiGlobal
            };
            msa.Compute();
            alignments = msa.GetAlignments().ToArray();

            Assert.That(alignments.Length, Is.EqualTo(1));
            AssertAlignmentsEqual(alignments[0], CreateAlignment(
                                      "| c a r | t",
                                      "| b a r |  "
                                      ));
            Assert.That(alignments[0].NormalizedScore, Is.EqualTo(0.57).Within(0.01));

            msa = new PairwiseAlignmentAlgorithm <string, char>(scorer, "cart", "art", GetChars)
            {
                Mode = AlignmentMode.SemiGlobal
            };
            msa.Compute();
            alignments = msa.GetAlignments().ToArray();

            Assert.That(alignments.Length, Is.EqualTo(1));
            AssertAlignmentsEqual(alignments[0], CreateAlignment(
                                      "c | a r t |",
                                      "  | a r t |"
                                      ));
            Assert.That(alignments[0].NormalizedScore, Is.EqualTo(0.86).Within(0.01));

            msa = new PairwiseAlignmentAlgorithm <string, char>(scorer, "start", "tan", GetChars)
            {
                Mode = AlignmentMode.SemiGlobal
            };
            msa.Compute();
            alignments = msa.GetAlignments().ToArray();

            Assert.That(alignments.Length, Is.EqualTo(1));
            AssertAlignmentsEqual(alignments[0], CreateAlignment(
                                      "s | t a r | t",
                                      "  | t a n |  "
                                      ));
            Assert.That(alignments[0].NormalizedScore, Is.EqualTo(0.50).Within(0.01));
        }
        public void GlobalAlign()
        {
            var scorer = new StringScorer();
            var msa    = new PairwiseAlignmentAlgorithm <string, char>(scorer, "car", "bar", GetChars);

            msa.Compute();
            Alignment <string, char>[] alignments = msa.GetAlignments().ToArray();

            Assert.That(alignments.Length, Is.EqualTo(1));
            AssertAlignmentsEqual(alignments[0], CreateAlignment(
                                      "| c a r |",
                                      "| b a r |"
                                      ));
            Assert.That(alignments[0].NormalizedScore, Is.EqualTo(0.66).Within(0.01));

            msa = new PairwiseAlignmentAlgorithm <string, char>(scorer, "cart", "bar", GetChars);
            msa.Compute();
            alignments = msa.GetAlignments().ToArray();

            Assert.That(alignments.Length, Is.EqualTo(1));
            AssertAlignmentsEqual(alignments[0], CreateAlignment(
                                      "| c a r t |",
                                      "| b a r - |"
                                      ));
            Assert.That(alignments[0].NormalizedScore, Is.EqualTo(0.25).Within(0.01));

            msa = new PairwiseAlignmentAlgorithm <string, char>(scorer, "cart", "art", GetChars);
            msa.Compute();
            alignments = msa.GetAlignments().ToArray();

            Assert.That(alignments.Length, Is.EqualTo(1));
            AssertAlignmentsEqual(alignments[0], CreateAlignment(
                                      "| c a r t |",
                                      "| - a r t |"
                                      ));
            Assert.That(alignments[0].NormalizedScore, Is.EqualTo(0.50).Within(0.01));

            msa = new PairwiseAlignmentAlgorithm <string, char>(scorer, "start", "tan", GetChars);
            msa.Compute();
            alignments = msa.GetAlignments().ToArray();

            Assert.That(alignments.Length, Is.EqualTo(2));
            AssertAlignmentsEqual(alignments[0], CreateAlignment(
                                      "| s t a r t |",
                                      "| - t a - n |"
                                      ));
            Assert.That(alignments[0].NormalizedScore, Is.EqualTo(0.00).Within(0.01));
            AssertAlignmentsEqual(alignments[1], CreateAlignment(
                                      "| s t a r t |",
                                      "| - t a n - |"
                                      ));
            Assert.That(alignments[1].NormalizedScore, Is.EqualTo(0.00).Within(0.01));
        }
        public void GlobalAlign_EmptySequence()
        {
            var scorer = new StringScorer();
            var msa    = new PairwiseAlignmentAlgorithm <string, char>(scorer, "", "", GetChars);

            msa.Compute();
            Alignment <string, char>[] alignments = msa.GetAlignments().ToArray();

            Assert.That(alignments.Length, Is.EqualTo(1));
            AssertAlignmentsEqual(alignments[0], CreateAlignment(
                                      "||",
                                      "||"
                                      ));
            Assert.That(alignments[0].NormalizedScore, Is.EqualTo(0));
        }
        public void AlignEmptySequence()
        {
            var scorer = new StringScorer();
            var msa    = new MultipleAlignmentAlgorithm <string, char>(scorer, new[] { "car", "", "bar" }, GetChars)
            {
                UseInputOrder = true
            };

            msa.Compute();
            Alignment <string, char> alignment = msa.GetAlignment();

            AssertAlignmentsEqual(alignment, CreateAlignment(
                                      "| c a r |",
                                      "| - - - |",
                                      "| b a r |"
                                      ));
        }
        public void AlignLessThanThreeSequences()
        {
            var scorer = new StringScorer();

            Assert.Throws <ArgumentException>(() =>
            {
                var msa = new MultipleAlignmentAlgorithm <string, char>(scorer, Enumerable.Empty <string>(), GetChars);
            });

            Assert.Throws <ArgumentException>(() =>
            {
                var msa = new MultipleAlignmentAlgorithm <string, char>(scorer, new[] { "bar" }, GetChars);
            });

            Assert.Throws <ArgumentException>(() =>
            {
                var msa = new MultipleAlignmentAlgorithm <string, char>(scorer, new[] { "car", "bar" }, GetChars);
            });
        }
        public void AlignMoreThanTwoSequences()
        {
            var scorer = new StringScorer();
            var msa    = new MultipleAlignmentAlgorithm <string, char>(scorer, new[] { "car", "bar", "carp" }, GetChars)
            {
                UseInputOrder = true
            };

            msa.Compute();
            Alignment <string, char> alignment = msa.GetAlignment();

            AssertAlignmentsEqual(alignment, CreateAlignment(
                                      "| c a r - |",
                                      "| b a r - |",
                                      "| c a r p |"
                                      ));

            msa = new MultipleAlignmentAlgorithm <string, char>(scorer, new[] { "car", "bar", "star" }, GetChars)
            {
                UseInputOrder = true
            };
            msa.Compute();
            alignment = msa.GetAlignment();

            AssertAlignmentsEqual(alignment, CreateAlignment(
                                      "| - c a r |",
                                      "| - b a r |",
                                      "| s t a r |"
                                      ));

            msa = new MultipleAlignmentAlgorithm <string, char>(scorer, new[] { "car", "bar", "stare" }, GetChars)
            {
                UseInputOrder = true
            };
            msa.Compute();
            alignment = msa.GetAlignment();

            AssertAlignmentsEqual(alignment, CreateAlignment(
                                      "| - c a r - |",
                                      "| - b a r - |",
                                      "| s t a r e |"
                                      ));

            msa = new MultipleAlignmentAlgorithm <string, char>(scorer, new[] { "scar", "car", "bar", "stare" }, GetChars)
            {
                UseInputOrder = true
            };
            msa.Compute();
            alignment = msa.GetAlignment();

            AssertAlignmentsEqual(alignment, CreateAlignment(
                                      "| s c a r - |",
                                      "| - c a r - |",
                                      "| - b a r - |",
                                      "| s t a r e |"
                                      ));

            msa = new MultipleAlignmentAlgorithm <string, char>(scorer, new[] { "sane", "scar", "car", "bar", "stare" }, GetChars)
            {
                UseInputOrder = true
            };
            msa.Compute();
            alignment = msa.GetAlignment();

            AssertAlignmentsEqual(alignment, CreateAlignment(
                                      "| s - a n e |",
                                      "| s c a r - |",
                                      "| - c a r - |",
                                      "| - b a r - |",
                                      "| s t a r e |"
                                      ));

            msa = new MultipleAlignmentAlgorithm <string, char>(scorer, new[] { "sane", "scar", "she", "car", "bar", "stare" }, GetChars)
            {
                UseInputOrder = true
            };
            msa.Compute();
            alignment = msa.GetAlignment();

            AssertAlignmentsEqual(alignment, CreateAlignment(
                                      "| s - a n e |",
                                      "| s c a r - |",
                                      "| s - - h e |",
                                      "| - c a r - |",
                                      "| - b a r - |",
                                      "| s t a r e |"
                                      ));
        }
        public void ExpansionCompressionAlign()
        {
            var scorer = new StringScorer();
            var msa    = new PairwiseAlignmentAlgorithm <string, char>(scorer, "car", "bar", GetChars)
            {
                ExpansionCompressionEnabled = true
            };

            msa.Compute();
            Alignment <string, char>[] alignments = msa.GetAlignments().ToArray();

            Assert.That(alignments.Length, Is.EqualTo(1));
            AssertAlignmentsEqual(alignments[0], CreateAlignment(
                                      "| c a r |",
                                      "| b a r |"
                                      ));
            Assert.That(alignments[0].NormalizedScore, Is.EqualTo(0.66).Within(0.01));

            msa = new PairwiseAlignmentAlgorithm <string, char>(scorer, "cart", "bar", GetChars)
            {
                ExpansionCompressionEnabled = true
            };
            msa.Compute();
            alignments = msa.GetAlignments().ToArray();

            Assert.That(alignments.Length, Is.EqualTo(1));
            AssertAlignmentsEqual(alignments[0], CreateAlignment(
                                      "| c a rt |",
                                      "| b a r  |"
                                      ));
            Assert.That(alignments[0].NormalizedScore, Is.EqualTo(0.50).Within(0.01));

            msa = new PairwiseAlignmentAlgorithm <string, char>(scorer, "cart", "art", GetChars)
            {
                ExpansionCompressionEnabled = true
            };
            msa.Compute();
            alignments = msa.GetAlignments().ToArray();

            Assert.That(alignments.Length, Is.EqualTo(1));
            AssertAlignmentsEqual(alignments[0], CreateAlignment(
                                      "| ca r t |",
                                      "| a  r t |"
                                      ));
            Assert.That(alignments[0].NormalizedScore, Is.EqualTo(0.75).Within(0.01));

            msa = new PairwiseAlignmentAlgorithm <string, char>(scorer, "start", "tan", GetChars)
            {
                ExpansionCompressionEnabled = true
            };
            msa.Compute();
            alignments = msa.GetAlignments().ToArray();

            Assert.That(alignments.Length, Is.EqualTo(2));
            AssertAlignmentsEqual(alignments[0], CreateAlignment(
                                      "| st ar t |",
                                      "| t  a  n |"
                                      ));
            Assert.That(alignments[0].NormalizedScore, Is.EqualTo(0.40).Within(0.01));
            AssertAlignmentsEqual(alignments[1], CreateAlignment(
                                      "| st a rt |",
                                      "| t  a n  |"
                                      ));
            Assert.That(alignments[1].NormalizedScore, Is.EqualTo(0.40).Within(0.01));
        }