斯卡拉分支和绑定主题搜索

时间:2014-06-10 13:32:17

标签: scala bioinformatics

下面的代码在序列(String)中搜索motif(长度为8),结果,它必须返回具有最佳分数的序列。 问题是,虽然代码没有产生错误,但根本没有输出(可能是无限循环,我观察空白控制台)。

我要将所有代码放到网上,如果需要的话。为了重现这个问题,只需传递一个数字(在0和3之间 - 你可以给出4个序列,所以你必须选择其中1个0是第一个,1是第二个等)作为args(0)(例如“0” “),预期输出应该看起来像”Motif = ctgatgta“

    import scala.util.control._

    object BranchAndBound {

      var seq: Array[String] = new Array[String](20)

      var startPos: Array[Int] = new Array[Int](20)

      var pickup: Array[String] = new Array[String](20)

      var bestMotif: Array[Int] = new Array[Int](20)

      var ScoreMatrix = Array.ofDim[Int](5, 20)

      var i: Int = _

      var j: Int = _

      var lmer: Int = _

      var t: Int = _

      def main(args: Array[String]) {

        var t1: Long = 0
        var t2: Long = 0

        t1 = 0
        t2 = 0
        t1 = System.currentTimeMillis()

        val seq0 = Array(
          Array(
            " >5 regulatory reagions with 69 bp",
            " cctgatagacgctatctggctatccaggtacttaggtcctctgtgcgaatctatgcgtttccaaccat",
            " agtactggtgtacatttgatccatacgtacaccggcaacctgaaacaaacgctcagaaccagaagtgc",
            " aaacgttagtgcaccctctttcttcgtggctctggccaacgagggctgatgtataagacgaaaatttt",
            " agcctccgatgtaagtcatagctgtaactattacctgccacccctattacatcttacgtccatataca",
            " ctgttatacaacgcgtcatggcggggtatgcgttttggtcgtcgtacgctcgatcgttaccgtacggc"),

          Array(
            " 2 columns mutants",
            " cctgatagacgctatctggctatccaggtacttaggtcctctgtgcgaatctatgcgtttccaaccat",
            " agtactggtgtacatttgatccatacgtacaccggcaacctgaaacaaacgctcagaaccagaagtgc",
            " aaacgttagtgcaccctctttcttcgtggctctggccaacgagggctgatgtataagacgaaaattttt",
            " agcctccgatgtaagtcatagctgtaactattacctgccacccctattacatcttacgtccatataca",
            " ctgttatacaacgcgtcatggcggggtatgcgttttggtcgtcgtacgctcgatcgttaccgtacggc"),

          Array(
            " 2 columns mutants",
            " cctgatagacgctatctggctatccaggtacttaggtcctctgtgcgaatctatgcgtttccaaccat",
            " agtactggtgtacatttgatccatacgtacaccggcaacctgaaacaaacgctcagaaccagaagtgc",
            " aaacgttagtgcaccctctttcttcgtggctctggccaacgagggctgatgtataagacgaaaattttt",
            " agcctccgatgtaagtcatagctgtaactattacctgccacccctattacatcttacgtccatataca",
            " ctgttatacaacgcgtcatggcggggtatgcgttttggtcgtcgtacgctcgatcgttaccgtacggc"),

          Array(
            " 2 columns mutants",
            " cctgatagacgctatctggctatccaggtacttaggtcctctgtgcgaatctatgcgtttccaaccat",
            " agtactggtgtacatttgatccatacgtacaccggcaacctgaaacaaacgctcagaaccagaagtgc",
            " aaacgttagtgcaccctctttcttcgtggctctggccaacgagggctgatgtataagacgaaaattttt",
            " agcctccgatgtaagtcatagctgtaactattacctgccacccctattacatcttacgtccatataca",
            " ctgttatacaacgcgtcatggcggggtatgcgttttggtcgtcgtacgctcgatcgttaccgtacggc"))

        var k: Int = 0
        var m: Int = 0
        var n: Int = 0
        var bestScore: Int = 0
        var optScore: Int = 0
        var get: Int = 0

        var ok1: Boolean = false
        var ok3: Boolean = false
        ok1 = false
        ok3 = false

        j = 1
        lmer = 8
        m = 1
        t = 5
        n = 69
        optScore = 0
        bestScore = 0

        k = java.lang.Integer.parseInt(args(0))
        j = 1

        while (j <= t) {
          seq(j) = new String()
          i = 0
          while (i < n) {
            seq(j) += seq0(k)(j).charAt(i)
            i += 1
          }
          j += 1
        }

        j = 1

        while (j <= t) {
          newPickup(1, j)
          j += 1
        }

        j = 0
        bestScore = 0
        i = 1

        val whilebreaker = new Breaks
        whilebreaker.breakable {
          while (i > 0) {

            if (i < t) {
              if (startPos(1) == (n - lmer)) whilebreaker.break

              val sc = Score()
              optScore = sc + (t - i) * lmer

              if (optScore < bestScore) {
                ok1 = false
                j = i

                val whilebreak1 = new Breaks
                whilebreak1.breakable {
                  while (j >= 1) {

                    if (startPos(j) < n - lmer) {
                      ok1 = true
                      newPickup(0, j)
                      whilebreak1.break
                    } else {
                      ok1 = true
                      newPickup(1, j)

                      val whilebreak2 = new Breaks
                      whilebreak2.breakable {
                        while (startPos(i - 1) == (n - lmer)) {
                          newPickup(1, i - 1)
                          i -= 1
                          if (i == 0) whilebreak2.break
                        }
                      }
                      if (i > 1) {
                        newPickup(0, i - 1)
                        i -= 1
                      }
                      whilebreak1.break
                    }
                  }
                }
                if (ok1 == false) i = 0
              } else {
                newPickup(1, i + 1)
                i += 1
              }
            } else {
              get = Score()
              if (get > bestScore) {
                bestScore = get
                m = 1
                while (m <= t) {
                  bestMotif(m) = startPos(m)
                  m += 1
                }
              }
              ok3 = false
              j = t

              val whilebreak3 = new Breaks
              whilebreak3.breakable {
                while (j >= 1) {
                  if (startPos(j) < n - lmer) {
                    ok3 = true
                    newPickup(0, j)
                    whilebreak3.break
                  } else {
                    ok3 = true
                    newPickup(1, j)

                    val whilebreak4 = new Breaks

                    whilebreak4.breakable {
                      while (startPos(i - 1) == (n - lmer)) {
                        newPickup(1, i - 1)
                        i -= 1
                        if (i == 0) whilebreak4.break
                      }
                    }
                    if (i > 1) {
                      newPickup(0, i - 1)
                      i -= 1
                    }
                    whilebreak3.break
                  }
                }
              }
              if (ok3 == false) i = 0
            }
          }
        }

        println("Motiv: " + Consensus())
        // println()

        j = 1

        while (j <= t) {
          t2 = System.currentTimeMillis()
          j += 1
        }

        println("time= " + (t2 - t1) + " ms")
      }

      def Score(): Int = {

        var j: Int = 0
        var k: Int = 0
        var m: Int = 0
        var max: Int = 0
        var sum: Int = 0
        sum = 0
        max = 0
        m = 1

        while (m <= lmer) {
          k = 1
          while (k <= 4) {
            ScoreMatrix(k)(m) = 0
            k += 1
          }
          m += 1
        }
        m = 1
        while (m <= lmer) {
          k = 1
          while (k <= i) pickup(k).charAt(m) match {
            case 'a' => ScoreMatrix(1)(m) += 1
            case 'c' => ScoreMatrix(2)(m) += 1
            case 'g' => ScoreMatrix(3)(m) += 1
            case 't' => ScoreMatrix(4)(m) += 1
          }
          m += 1
        }
        j = 1
        while (j <= lmer) {
          max = 0
          m = 1
          while (m <= 4) {
            if (ScoreMatrix(m)(j) > max) {
              max = ScoreMatrix(m)(j)
            }
            m += 1
          }
          sum += max
          j += 1
        }
        sum
      }

      def Consensus(): String = {
        var i: Int = 0
        var j: Int = 0
        var k: Int = 0
        var m: Int = 0
        var max: Int = 0
        var imax: Int = 0
        var str: String = null
        i = 1
        while (i <= t) {
          pickup(i) = " " +
            seq(i).substring(bestMotif(i), bestMotif(i) + lmer)
          i += 1
        }
        m = 1
        while (m <= lmer) {
          k = 1
          while (k <= 4) {
            ScoreMatrix(k)(m) = 0
            k += 1
          }
          m += 1
        }
        m = 1
        while (m <= lmer) {
          k = 1
          while (k <= t) pickup(k).charAt(m) match {
            case 'a' => ScoreMatrix(1)(m) += 1
            case 'c' => ScoreMatrix(2)(m) += 1
            case 'g' => ScoreMatrix(3)(m) += 1
            case 't' => ScoreMatrix(4)(m) += 1
          }
          m += 1
        }
        str = ""
        imax = 0
        j = 1
        while (j <= lmer) {
          max = 0
          i = 1
          while (i <= 4) {
            if (ScoreMatrix(i)(j) > max) {
              max = ScoreMatrix(i)(j)
              imax = i
            }
            i += 1
          }
          imax match {
            case 1 => str += 'a'
            case 2 => str += 'c'
            case 3 => str += 'g'
            case 4 => str += 't'
          }
          j += 1
        }
        str
      }

      def newPickup(one: Int, h: Int) {
        if (one == 1) startPos(h) = 1 else startPos(h) += 1
        pickup(h) = " " + seq(h).substring(startPos(h), startPos(h) + lmer)
      }
    }

谢谢,我希望有人能找到我的失败。

1 个答案:

答案 0 :(得分:1)

您目前的实施情况&#39;挂起&#39;在这个循环中:

while (k <= i) pickup(k).charAt(m) match {
        case 'a' => ScoreMatrix(1)(m) += 1
        case 'c' => ScoreMatrix(2)(m) += 1
        case 'g' => ScoreMatrix(3)(m) += 1
        case 't' => ScoreMatrix(4)(m) += 1
 }

目前,退出条件永远不会实现,因为ki之间的关系永远不会改变。递增k或递减i

看起来编程不是这项工作的关键方面,但增加模块化应该有助于控制复杂性。

另外,我想知道使用Scala的选择。该算法中的许多领域将受益于更具功能性的方法。在这种翻译中,以强制方式使用Scala变得很麻烦。如果您有机会,我建议您探索一种更实用的方法来解决这个问题。

小贴士:intellij调试器对此代码没有任何问题。