fix bad variable passing
separate graph initilialisaton phase so that this can be done only once.
This commit is contained in:
parent
08a736fea2
commit
4cebf98f0c
@ -1,7 +1,9 @@
|
|||||||
|
|
||||||
:- module(clpbn_connected,
|
:- module(clpbn_connected,
|
||||||
[clpbn_subgraphs/2,
|
[clpbn_subgraphs/2,
|
||||||
influences/4]).
|
influences/4,
|
||||||
|
init_influences/3,
|
||||||
|
influences/5]).
|
||||||
|
|
||||||
:- use_module(library(dgraphs),
|
:- use_module(library(dgraphs),
|
||||||
[dgraph_new/1,
|
[dgraph_new/1,
|
||||||
@ -67,20 +69,26 @@ same_keys([K1-El|More], K, [El|Els], Rest) :-
|
|||||||
same_keys(Rest, _, [], Rest).
|
same_keys(Rest, _, [], Rest).
|
||||||
|
|
||||||
influences_more([], _, _, Is, Is, Evs, Evs, V2, V2).
|
influences_more([], _, _, Is, Is, Evs, Evs, V2, V2).
|
||||||
influences_more([V|LV], G, RG, Is0, Is, Evs0, Evs, V0, V2) :-
|
influences_more([V|LV], G, RG, Is0, Is, Evs0, Evs, GV0, GV2) :-
|
||||||
rb_lookup(V, _, V0), !,
|
rb_lookup(V, _, GV0), !,
|
||||||
influences_more(LV, G, RG, Is0, Is, Evs0, Evs, V0, V2).
|
influences_more(LV, G, RG, Is0, Is, Evs0, Evs, GV0, GV2).
|
||||||
influences_more([V|LV], G, RG, Is0, Is, Evs0, Evs, V0, V2) :-
|
influences_more([V|LV], G, RG, Is0, Is, Evs0, Evs, GV0, GV3) :-
|
||||||
rb_insert(V0, V, _, V1),
|
rb_insert(GV0, V, _, GV1),
|
||||||
follow_dgraph(V, G, RG, [V|Is0], Is1, [V|Evs0], Evs1, V1, V2),
|
follow_dgraph(V, G, RG, [V|Is0], Is1, [V|Evs0], Evs1, GV1, GV2),
|
||||||
influences_more(LV, G, RG, Is1, Is, Evs1, Evs, V1, V2).
|
influences_more(LV, G, RG, Is1, Is, Evs1, Evs, GV2, GV3).
|
||||||
|
|
||||||
% search for the set of variables that influence V
|
% search for the set of variables that influence V
|
||||||
influences(_,[],[], []).
|
influences(Vs, LV, Is, Evs) :-
|
||||||
influences(Vs,[V|LV], Is, Evs) :-
|
init_influences(Vs, G, RG),
|
||||||
|
influences(LV, Is, Evs, G, RG).
|
||||||
|
|
||||||
|
init_influences(Vs, G, RG) :-
|
||||||
dgraph_new(G0),
|
dgraph_new(G0),
|
||||||
dgraph_new(RG0),
|
dgraph_new(RG0),
|
||||||
to_dgraph(Vs, G0, G, RG0, RG),
|
to_dgraph(Vs, G0, G, RG0, RG).
|
||||||
|
|
||||||
|
influences([], [], [], _, _).
|
||||||
|
influences([V|LV], Is, Evs, G, RG) :-
|
||||||
rb_new(V0),
|
rb_new(V0),
|
||||||
rb_insert(V0, V, _, V1),
|
rb_insert(V0, V, _, V1),
|
||||||
follow_dgraph(V, G, RG, [V], Is1, [V], Evs1, V1, V2),
|
follow_dgraph(V, G, RG, [V], Is1, [V], Evs1, V1, V2),
|
||||||
@ -128,7 +136,7 @@ add_parents([V|Vs], G, RG, Is0, IsF, Evs0, EvsF, Visited0, VisitedF) :-
|
|||||||
% we will need to find its parents.
|
% we will need to find its parents.
|
||||||
add_parents([V|Vs], G, RG, Is0, IsF, Evs0, EvsF, Visited0, VisitedF) :-
|
add_parents([V|Vs], G, RG, Is0, IsF, Evs0, EvsF, Visited0, VisitedF) :-
|
||||||
rb_insert(Visited0, V, _, VisitedI),
|
rb_insert(Visited0, V, _, VisitedI),
|
||||||
follow_dgraph(V, G, RG, [V|Is0], IsI, [V|Evs0], EvsI, VisitedI, VisitedII),
|
follow_dgraph(V, G, RG, [V|Is0], IsI, [V|Evs0], EvsI, VisitedI, VisitedII),
|
||||||
add_parents(Vs, G, RG, IsI, IsF, EvsI, EvsF, VisitedII, VisitedF).
|
add_parents(Vs, G, RG, IsI, IsF, EvsI, EvsF, VisitedII, VisitedF).
|
||||||
|
|
||||||
add_kids([], _, _, Is, Is, Evs, Evs, Visited, Visited).
|
add_kids([], _, _, Is, Is, Evs, Evs, Visited, Visited).
|
||||||
@ -148,7 +156,7 @@ add_kids([V|Vs], G, RG, Is0, IsF, Evs0, EvsF, Visited0, VisitedF) :-
|
|||||||
(Is1 = Is0 ->
|
(Is1 = Is0 ->
|
||||||
% ignore whatever we did with this node,
|
% ignore whatever we did with this node,
|
||||||
% it didn't lead anywhere (all parents have evidence).
|
% it didn't lead anywhere (all parents have evidence).
|
||||||
add_kids(Vs, G, RG, Is0, IsF, Evs0, EvsF, Visited1, VisitedF)
|
add_kids(Vs, G, RG, Is0, IsF, [V|Evs0], EvsF, Visited1, VisitedF)
|
||||||
;
|
;
|
||||||
% insert parents
|
% insert parents
|
||||||
add_kids(Vs, G, RG, Is1, IsF, EvsI, EvsF, VisitedI, VisitedF)
|
add_kids(Vs, G, RG, Is1, IsF, EvsI, EvsF, VisitedI, VisitedF)
|
||||||
|
Reference in New Issue
Block a user