Merge and aggregate datasets: Difference between revisions

Content added Content deleted
(Add Mercury task)
(→‎{{header|Mercury}}: simplify bag_max)
Line 707: Line 707:
:- pred bag_sum(pred(float)::(pred(out) is nondet), float::out) is det.
:- pred bag_sum(pred(float)::(pred(out) is nondet), float::out) is det.
:- pred bag_avg(pred(float)::(pred(out) is nondet), float::out) is det.
:- pred bag_avg(pred(float)::(pred(out) is nondet), float::out) is det.
:- pred bag_max(pred(T)::(pred(out) is nondet), T::in, T::out) is det.
bag_count(Predicate, Count) :-
bag_count(Predicate, Count) :-
promise_equivalent_solutions[Count] (
promise_equivalent_solutions[Count] (
Line 721: Line 722:
bag_sum(Predicate, Sum),
bag_sum(Predicate, Sum),
(if N = 0 then Avg = nan else Avg is Sum/float(N)).
(if N = 0 then Avg = nan else Avg is Sum/float(N)).
bag_max(Predicate, Initial, Max) :-

promise_equivalent_solutions [Max] (
:- pred max_date(maybe_date::in, maybe_date::in, maybe_date::out) is det.
unsorted_aggregate(Predicate,
:- pred bag_max_date(pred(maybe_date)::(pred(out) is nondet), maybe_date::out) is det.
(pred(X::in,Y::in,Z::out) is det :-
max_date(date(Y1,M1,D1), date(Y2,M2,D2), Date) :-
compare(R, date(Y1,M1,D1), date(Y2,M2,D2)),
compare(R,X,Y),
(if R = (>) then Date = date(Y1,M1,D1) else Date = date(Y2,M2,D2)).
(if R = (>) then Z = X else Z = Y)),
Initial, Max)).
max_date(no, date(Y,M,D), date(Y,M,D)).
max_date(date(Y,M,D), no, date(Y,M,D)).
max_date(no, no, no).
bag_max_date(Predicate, Max) :-
promise_equivalent_solutions[Max]
(unsorted_aggregate(Predicate, max_date, no, Max)).


main(!IO) :-
main(!IO) :-
Line 741: Line 737:
bag_avg(Scores, Avg),
bag_avg(Scores, Avg),
bag_sum(Scores, Sum),
bag_sum(Scores, Sum),
Dates = (pred(Date::out) is nondet :- visit(Id,Date,_)),
Dates = (pred(Date::out) is nondet :- visit(Id,Date,_), Date=date(_,_,_)),
bag_max_date(Dates, MaxDate)),
bag_max(Dates, date(0,0,0), MaxDate1),
(if MaxDate1 = date(0,0,0) then MaxDate = no else MaxDate = MaxDate1)),
Solutions),
Solutions),
foldl(io.write_line, Solutions, !IO).</lang>
foldl(io.write_line, Solutions, !IO).</lang>