append the entire queues instead of inserting each element individually

This commit is contained in:
Markus Triska
2023-08-15 21:43:19 +02:00
parent 327423ab84
commit 04fbb0c1ce

View File

@@ -2672,13 +2672,34 @@ propagator_init_trigger(Vs, P) -->
variables_same_queue(Vs0) :- variables_same_queue(Vs0) :-
include(var, Vs0, Vs), include(var, Vs0, Vs),
new_queue(Q), ( Vs == [] -> true
maplist(variable_queue, Vs, Qs), ; maplist(variable_queue, Vs, Qs0),
phrase((collect_goal(Qs), sort(Qs0, [Q|Qs]),
collect_fast(Qs), Q =.. [_|Args],
collect_slow(Qs)), [Q], [Q]), append_queues_(Qs, Args, [append,append,append,ignore]),
maplist(clear_queue, Qs), maplist(clear_queue, Qs),
maplist(=(Q), Qs). maplist(=(Q), Qs)
).
append_queues_([], _, _).
append_queues_([Q|Qs], Args0, Is) :-
Q =.. [_|Args],
maplist(append_queue, Is, Args0, Args),
append_queues_(Qs, Args, Is).
append_queue(ignore, _, _).
append_queue(append, Q0, Q) :-
( get_atts(Q0, queue(Ls0,Ls)) ->
( get_atts(Q, queue(Ms0,Ms)) ->
Ls = Ms0,
put_atts(Q0, queue(Ls0,Ms))
; true
)
; ( get_atts(Q, queue(Ms0,Ms)) ->
put_atts(Q0, queue(Ms0,Ms))
; true
)
).
clear_queue(queue(Goals,Fast,Slow,Aux)) :- clear_queue(queue(Goals,Fast,Slow,Aux)) :-
put_atts(Goals, -queue(_,_)), put_atts(Goals, -queue(_,_)),
@@ -2686,22 +2707,6 @@ clear_queue(queue(Goals,Fast,Slow,Aux)) :-
put_atts(Slow, -queue(_,_)), put_atts(Slow, -queue(_,_)),
put_atts(Aux, -disabled). put_atts(Aux, -disabled).
collect_goal(Qs) --> collect_arg(Qs, 1).
collect_fast(Qs) --> collect_arg(Qs, 2).
collect_slow(Qs) --> collect_arg(Qs, 3).
collect_arg([], _) --> [].
collect_arg([Q|Qs], Which) -->
collect_all_(Q, Which),
collect_arg(Qs, Which).
collect_all_(Q, Which) -->
( { queue_get_arg_(Q, Which, Element) } ->
insert_queue(Element, Which),
collect_all_(Q, Which)
; []
).
variable_queue(Var, Q) :- variable_queue(Var, Q) :-
get_attr(Var, clpz, Attr), get_attr(Var, clpz, Attr),
Attr = clpz_attr(_Left,_Right,_Spread,_Dom,_Ps,Q). Attr = clpz_attr(_Left,_Right,_Spread,_Dom,_Ps,Q).