Tôi đang thực hiện Smith-Waterman thuật toán trong Haskell, nhưng tôi nhận được một lỗi runtime: <<loop>>
Các mảng Haskell quá nghiêm ngặt?
Trong thực hiện của tôi, tôi đang cố gắng để sử dụng bản chất lười biếng của Haskell, vì vậy tôi sử dụng một mảng bất biến resarray
để lưu trữ các nhánh lười và đệ quy cũng tham chiếu đến mảng đó (trong chuỗi phụ thuộc resarray
phụ thuộc vào zippedList
phụ thuộc vào cellDef
phụ thuộc vào cell
phụ thuộc vào resarray
). Mỗi ô đề cập đến một ô có chỉ số thấp hơn, do đó tính toán phải khả thi ... mặc dù nó không hoạt động theo cách đó.
Như một bằng chứng của khái niệm, tôi đã thử sau đây trong ghci:
let arr = listArray (0,3) [0, arr ! 0, arr ! 1, arr ! 2 ]
và nó làm việc. Tuy nhiên, tính toán dài hơn của tôi sẽ trở nên nghiêm ngặt vì một số lý do không xác định.
Đây là mã (phiên bản hoàn chỉnh, cùng với một kịch bản thử nghiệm, là here) của tôi:
buildSWArray::
WordSequence ->
WordSequence ->
SWMatrix
buildSWArray ws1 ws2 = let
rows = arrLen ws1
cols = arrLen ws2
im = matToLinearIndex rows cols
mi = linToMatIndex rows cols
totsize = rows * cols
ixarr = [0 .. (totsize-1)]
cell i j
| i < 0 || j < 0 = 0
cell i j =
resarr ! (im i j)
cellDef k | k == 0 = (None,0)
cellDef k =
let
(i,j) = mi k
upwards = cell (i-1) j
leftwards = cell i (j-1)
diag = cell (i-1) (j-1)
-- One up if match, -5 if not match
c = if ws1 ! i == ws2 ! j then 1 else (-5)
hi = maximum [ 0, diag + c, upwards - 3, leftwards - 3]
in
-- Dirty way of guessing which one was picked up
case hi of
hi | hi == 0 -> (None, 0)
hi | hi == upwards - 3 -> (Upwards, hi)
hi | hi == leftwards - 3 -> (Leftwards, hi)
hi | hi == diag + c -> (Diag, hi)
zippedList = [ cellDef k | k <- ixarr ]
resarr = IA.listArray (0,(totsize - 1)) [ score | (way,score) <- zippedList ]
wayarr = IA.listArray (0,(totsize - 1)) [ way | (way,score) <- zippedList ]
in
SWMatrix rows cols wayarr resarr
Làm thế nào tôi có thể sửa chữa nó?
phỏng đoán của tôi là bạn đã không 'gắn nút thắt' đúng cách. Kiểm tra các trường hợp cơ sở của bạn và xác minh giả định của bạn rằng đối số đệ quy của bạn đang giảm. – cdk