저는 몇 가지 생물 정보학을위한 특수화 된 쿼드 트리를 개발 중입니다. qtree에서의 유형은 다음과 같습니다 당신은 아이디어를 얻을일반 나무와 같은 구조에서 일치를 처리하기위한 코드 생성?
let rec add_node base k qtree =
let rec aux k' accum qtree' =
if k' = k then
match qtree' with
| Nd(bse, Empty, cc, gg, tt) -> Nd(bse, (Leaf(ref accum)),cc,gg,tt)
| Nd(bse, aa, Empty, gg, tt) -> Nd(bse, aa,(Leaf(ref accum)),gg,tt)
| Nd(bse, aa, cc, Empty, tt) -> Nd(bse, aa,cc,(Leaf(ref accum)),tt)
| Nd(bse, aa, cc, gg, Empty) -> Nd(bse, aa,cc,gg,(Leaf(ref accum)))
| Leaf _ -> qtree'
| Empty -> Leaf(ref accum)
| _ -> qtree'
else
match qtree' with
| Leaf(iref) -> iref := !iref + 1; qtree'
| Nd(bse, Empty,Empty,Empty,Empty) -> (*all empty*)
(
match base with
| A -> Nd(bse,(new_node base),Empty,Empty,Empty)
| C -> Nd(bse,Empty,(new_node base),Empty,Empty)
| G -> Nd(bse,Empty,Empty,(new_node base),Empty)
| T -> Nd(bse,Empty,Empty,Empty,(new_node base))
| _ -> qtree'
)
...
| Nd(bse, Empty,(Nd(_,_,_,_,_) as c),(Nd(_,_,_,_,_) as g),(Nd(_,_,_,_,_) as t)) ->
(
match base with
| A -> Nd(bse,(new_node base),(aux (k'+1) (accum+1) c),(aux (k'+1) (accum+1) g),(aux (k'+1) (accum+1) t))
| C -> Nd(bse,Empty,(aux (k'+1)(accum+1) c),(aux (k'+1)(accum+1) g),(aux (k'+1)(accum+1) t))
| G -> Nd(bse,Empty,(aux (k'+1)(accum+1) c),(aux (k'+1)(accum+1) g),(aux (k'+1)(accum+1) t))
| T -> Nd(bse,Empty,(aux (k'+1)(accum+1) c),(aux (k'+1)(accum+1) g),(aux (k'+1)(accum+1) t))
| _ -> qtree'
)
...
| Nd(bse, (Nd(_,_,_,_,_) as a),(Nd(_,_,_,_,_) as c),(Nd(_,_,_,_,_) as g),(Nd(_,_,_,_,_) as t)) ->
...
, 기본적으로 내가 필요 : 중 건설 또는 뭔가와 끝까지 걸을 때
이제type base = A | C | G | T | ROOT ;;
type quad_tree = Nd of bases * quad_tree * quad_tree * quad_tree * quad_tree
| Empty
| Leaf of int ref ;;
let init_quad_tree = Nd(ROOT, Empty,Empty,Empty,Empty);;
let new_node b = Nd(b,Empty,Empty,Empty,Empty);;
이 나무 된 경기를 할 거기에 16 개의 모든 조합을 포함합니다 (비어 있거나 Nd 일 수있는 4 개의 하위 트리). 그것은 많은 타이핑이고 오류가 발생하기 쉽습니다.
그러나 코드 생성에 도움이되는 매우 규칙적인 구조입니다. Ruby 스크립트를 사용하여이 코드를 실제로 생성하려고했으나 campl4 또는 새로운 -ppx 스타일의 "매크로"(더 나은 용어가없는 경우)를 사용할 수 있는지 궁금합니다. 그렇다면 어떻게 그 방향 중 하나에서 시작할 수 있습니까?
여기서 무엇을 표현하고 달성하려고합니까? 왜 두 종류의 잎이 있습니까 ('Empty','Leaf')? 왜 뿌리가 섞인 거지? 왜 유형이'base'가 아닌'base'라고 불리는가? –
좋은 질문. 그냥 귀하의 의견을 읽기 전에 기지를 내 코드에서 기본으로 변경했습니다 (위 변경). ROOT는 맨 위의 ROOT 노드에 레이블을 지정하기위한 것입니다. Empty와 Leaf는 다른 것입니다 : Empty는 초기 조건입니다. Leaf는 문자열이 몇 번이나 봤는지 보여줍니다 (의도는 위의 코드는이를 반영하지 않고 누적은 현재 레벨을 보여줍니다). 나무). – aneccodeal
기본적으로 고정 길이 문자열 (이 경우 기본 또는 k-mer)의 트리입니다. k-mer가 이미 본 횟수는 나뭇잎에 저장됩니다 (리프 유형을 Leaf of base * int ref로 변경해야 함). – aneccodeal