git-svn-id: https://yap.svn.sf.net/svnroot/yap/trunk@2124 b08c6af1-5177-4d33-ba66-4b1c6b8b522a
		
			
				
	
	
		
			111 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Prolog
		
	
	
	
	
	
			
		
		
	
	
			111 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Prolog
		
	
	
	
	
	
| /*
 | |
| cd ~/Yap/CLPBN/FullBNT-1.0.4
 | |
| addpath(genpathKPM(pwd))
 | |
| N = 4; 
 | |
| dag = false(N,N);
 | |
| C = 1; S = 2; R = 3; W = 4;
 | |
| dag(C,[R S]) = 1;
 | |
| dag(R,W) = 1;
 | |
| dag(S,W)=1;
 | |
| discrete_nodes = 1:N;
 | |
| node_sizes = 2*ones(1,N); 
 | |
| bnet = mk_bnet(dag, node_sizes, 'discrete', discrete_nodes);
 | |
| bnet.CPD{W} = tabular_CPD(bnet, W, 'CPT', [1 0.1 0.1 0.01 0 0.9 0.9 0.99]);
 | |
| bnet.CPD{C} = tabular_CPD(bnet, C, [0.5 0.5]);
 | |
| bnet.CPD{R} = tabular_CPD(bnet, R, [0.8 0.2 0.2 0.8]);
 | |
| bnet.CPD{S} = tabular_CPD(bnet, S, [0.5 0.9 0.5 0.1]);
 | |
| engine = jtree_inf_engine(bnet);
 | |
| evidence = cell(1,N);
 | |
| evidence{W} = 2;
 | |
| [engine, loglik] = enter_evidence(engine, evidence);
 | |
| marg = marginal_nodes(engine, S);
 | |
| marg.T
 | |
| */
 | |
| 
 | |
| :- ensure_loaded(library(matlab)).
 | |
| 
 | |
| :- yap_flag(write_strings, on).
 | |
| 
 | |
| % syntactic sugar for matlab_call.
 | |
| :- op(800,yfx,<--).
 | |
| 
 | |
| G <-- Y :-
 | |
| 	matlab_call(Y,G).
 | |
| 
 | |
| do(Out,Out2) :-
 | |
| 	init_bnt,
 | |
| 	N = 4, 
 | |
| 	C = 1, S = 2, R = 3, W = 4,
 | |
| 	mkdag(N,[C-R,C-S,R-W,S-W]),
 | |
| 	matlab_sequence(1,N,discrete_nodes),
 | |
| 	mk2s(N,L), % domain has size 2
 | |
| 	matlab_matrix(1,N,L,node_sizes),
 | |
| 	bnet <-- mk_bnet(dag, node_sizes, \discrete, discrete_nodes),
 | |
| 	mkcpt(bnet,W,[1, 0.1, 0.1, 0.01, 0, 0.9, 0.9, 0.99]),
 | |
| 	mkcpt(bnet,C,[0.5, 0.5]),
 | |
| 	mkcpt(bnet,R,[0.8, 0.2, 0.2, 0.8]),
 | |
| 	mkcpt(bnet,S,[0.5, 0.9, 0.5, 0.1]),
 | |
| 	engine <-- jtree_inf_engine(bnet),
 | |
| 	mkevidence(N,[W-2]),
 | |
| 	marg <-- marginal_nodes(engine, S),
 | |
| 	matlab_get_variable( marg.'T', Out),
 | |
| 	add_evidence([R-2]),
 | |
| 	marg <-- marginal_nodes(engine, S),
 | |
| 	matlab_get_variable( marg.'T', Out2).
 | |
| 
 | |
| init_bnt :-
 | |
| 	matlab_on, !.
 | |
| init_bnt :-
 | |
| 	getcwd(D),
 | |
| 	cd('~/Yap/CLPBN/FullBNT/BNT'),
 | |
| 	start_matlab('matlab -nojvm -nosplash'),
 | |
| 	matlab_eval_string("add_BNT_to_path",_),
 | |
| 	cd(D).
 | |
| 	
 | |
| mk2s(0, []) :- !.
 | |
| mk2s(I, [2|L]) :-
 | |
| 	I0 is I-1,
 | |
| 	mk2s(I0, L).
 | |
| 
 | |
| mkdag(N,Els) :-
 | |
| 	Tot is N*N,
 | |
| 	functor(Dag,dag,Tot),
 | |
| 	add_els(Els,N,Dag),
 | |
| 	Dag=..[_|L],
 | |
| 	addzeros(L),
 | |
| 	matlab_matrix(N,N,L,dag).
 | |
| 
 | |
| add_els([],_,_).
 | |
| add_els([X-Y|Els],N,Dag) :-
 | |
| 	Pos is (X-1)*N+Y,
 | |
| 	arg(Pos,Dag,1),
 | |
| 	add_els(Els,N,Dag).
 | |
| 
 | |
| addzeros([]).
 | |
| addzeros([0|L]) :- !,
 | |
| 	addzeros(L).
 | |
| addzeros([1|L]) :-
 | |
| 	addzeros(L).
 | |
| 
 | |
| mkcpt(BayesNet, V, Tab) :-
 | |
| 	(BayesNet.'CPD'({V})) <-- tabular_CPD(BayesNet,V,Tab).
 | |
| 
 | |
| mkevidence(N,L) :-
 | |
| 	mkeventries(L,LN),
 | |
| 	matlab_initialized_cells( 1, N, LN, evidence),
 | |
| 	[engine, loglik] <-- enter_evidence(engine, evidence).
 | |
| 
 | |
| mkeventries([],[]).
 | |
| mkeventries([A-V|L],[ev(1,A,V)|LN]) :-
 | |
| 	mkeventries(L,LN).
 | |
| 
 | |
| add_evidence(L) :-
 | |
| 	add_to_evidence(L),
 | |
| 	[engine, loglik] <-- enter_evidence(engine, evidence).
 | |
| 
 | |
| add_to_evidence([]).
 | |
| add_to_evidence([Pos-Val|L]) :-
 | |
| 	matlab_item1(evidence,Pos,Val),
 | |
| 	add_to_evidence(L).
 | |
| 	
 |