84 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			84 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								:- module(hmm, [init_hmm/0,
							 | 
						||
| 
								 | 
							
										  hmm_state/1,
							 | 
						||
| 
								 | 
							
										  emission/1]).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								:- ensure_loaded(library(clpbn)).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								:- use_module(library(lists),
							 | 
						||
| 
								 | 
							
									      [nth/3]).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								:- use_module(library(nbhash),
							 | 
						||
| 
								 | 
							
									      [nb_hash_new/2,
							 | 
						||
| 
								 | 
							
									       nb_hash_lookup/3,
							 | 
						||
| 
								 | 
							
									       nb_hash_insert/3
							 | 
						||
| 
								 | 
							
									      ]).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								:- ensure_loaded(library(tries)).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								:- meta_predicate hmm_state(:).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								:- dynamic hmm_tabled/1.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								:- attribute emission/1.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								:- ensure_loaded(library('clpbn/viterbi')).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								init_hmm :-
							 | 
						||
| 
								 | 
							
								%	retractall(hmm_tabled(_)).
							 | 
						||
| 
								 | 
							
								%	eraseall(hmm_tabled).
							 | 
						||
| 
								 | 
							
								%	nb_hash_new(hmm_table, 1000000).
							 | 
						||
| 
								 | 
							
									trie_open(Trie), nb_setval(trie,Trie).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								hmm_state(Mod:A) :- !, hmm_state(A,Mod).
							 | 
						||
| 
								 | 
							
								hmm_state(A) :- prolog_flag(typein_module,Mod), hmm_state(A,Mod).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								hmm_state(Mod:N/A,_) :- !,
							 | 
						||
| 
								 | 
							
									hmm_state(N/A,Mod).
							 | 
						||
| 
								 | 
							
								hmm_state((A,B),Mod) :- !,
							 | 
						||
| 
								 | 
							
									hmm_state(A,Mod),
							 | 
						||
| 
								 | 
							
									hmm_state(B,Mod).
							 | 
						||
| 
								 | 
							
								hmm_state(N/A,Mod) :-
							 | 
						||
| 
								 | 
							
									atom_codes(N,[TC|_]),
							 | 
						||
| 
								 | 
							
									atom_codes(T,[TC]),
							 | 
						||
| 
								 | 
							
									build_args(A,LArgs,KArgs,First,Last),
							 | 
						||
| 
								 | 
							
									Key =.. [T|KArgs],
							 | 
						||
| 
								 | 
							
									Head =.. [N|LArgs],
							 | 
						||
| 
								 | 
							
									asserta_static( (Mod:Head :-
							 | 
						||
| 
								 | 
							
									        ( First > 2 -> 
							 | 
						||
| 
								 | 
							
										  Last = Key, !
							 | 
						||
| 
								 | 
							
										;
							 | 
						||
| 
								 | 
							
										  nb_getval(trie, Trie), trie_check_entry(Trie, Key, _)
							 | 
						||
| 
								 | 
							
										->
							 | 
						||
| 
								 | 
							
										  % leave work for solver!
							 | 
						||
| 
								 | 
							
										  %
							 | 
						||
| 
								 | 
							
										  Last = Key, !
							 | 
						||
| 
								 | 
							
										;
							 | 
						||
| 
								 | 
							
										  % first time we saw this entry
							 | 
						||
| 
								 | 
							
										  nb_getval(trie, Trie), trie_put_entry(Trie, Key, _),
							 | 
						||
| 
								 | 
							
										  fail
							 | 
						||
| 
								 | 
							
										)
							 | 
						||
| 
								 | 
							
									      )
							 | 
						||
| 
								 | 
							
									      ).
							 | 
						||
| 
								 | 
							
									
							 | 
						||
| 
								 | 
							
								build_args(4,[A,B,C,D],[A,B,C],A,D).
							 | 
						||
| 
								 | 
							
								build_args(3,  [A,B,C],  [A,B],A,C).
							 | 
						||
| 
								 | 
							
								build_args(2,    [A,B],    [A],A,B).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								emission(V) :-
							 | 
						||
| 
								 | 
							
									put_atts(V,[emission(Prob)]).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								cvt_vals(aminoacids,[a,  c,  d,  e,  f,  g,  h,  i,  k,  l,  m,  n,  p,  q,  r,  s,  t,  v,  w,  y]).
							 | 
						||
| 
								 | 
							
								cvt_vals(bool,[t,f]).
							 | 
						||
| 
								 | 
							
								cvt_vals(dna,[a,c,g,t]).
							 | 
						||
| 
								 | 
							
								cvt_vals(rna,[a,c,g,u]).
							 | 
						||
| 
								 | 
							
								cvt_vals([A|B],[A|B]).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								% first, try standard representation
							 | 
						||
| 
								 | 
							
								find_probs(Logs,Nth,Log) :-
							 | 
						||
| 
								 | 
							
									arg(Nth,Logs,Log).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 |