Files
mercury/tests/hard_coded/construct_bug_helper_1.m
Zoltan Somogyi 2bd7c5ee3e Rename X's aux modules as X_helper_N in hard_coded.
tests/hard_coded/*.m:
    Rename modules as mentioned above.

    In a few cases, where the main module's name itself had a suffix,
    such as "_mod_a" or "_main", remove that suffix. This entails
    renaming the .exp file as well. (In some cases, this meant that
    the name of a helper module was "taken over" by the main module
    of the test case.)

    Update all references to the moved modules.

    General updates to programming style, such as

    - replacing DCG notation with state var notation
    - replacing (C->T;E) with (if C then T else E)
    - moving pred/func declarations to just before their code
    - replacing io.write/io.nl sequences with io.write_line
    - replacing io.print/io.nl sequences with io.print_line
    - fixing too-long lines
    - fixing grammar errors in comments

tests/hard_coded/Mmakefile:
tests/hard_coded/Mercury.options:
    Update all references to the moved modules.

    Enable the constant_prop_int test case. The fact that it wasn't enabled
    before is probably an accident. (When constant_prop_int.m was created,
    the test case was added to a list in the Mmakefile, but that list
    was later removed due to never being referenced.)

tests/hard_coded/constant_prop_int.{m,exp}:
    Delete the calls to shift operations with negative shift amounts,
    since we have added a compile-time error for these since the test
    was originally created.
2023-06-16 08:33:22 +02:00

206 lines
5.7 KiB
Mathematica

% vim: ft=mercury ts=4 sw=4 et
%
% This is part of the construct_bug test case.
:- module construct_bug_helper_1.
:- interface.
:- import_module string.
:- import_module list.
:- import_module int.
:- import_module assoc_list.
:- type stat.
:- type statkey == list(string).
:- func init = (stat::out) is det.
:- func blank = (stat::out) is det.
:- pred count(statkey, stat, stat).
:- mode count(in, in, out) is det.
:- pred count(int, statkey, stat, stat).
:- mode count(in, in, in, out) is det.
% Same as count/4, just reversed the first two args
:- pred count_more(statkey, int, stat, stat).
:- mode count_more(in, in, in, out) is det.
:- func count(statkey, stat) = stat.
:- mode count(in, in) = out is det.
:- func count(int, statkey, stat) = stat.
:- mode count(in, in, in) = out is det.
:- func union(stat, stat) = stat.
% Sums the information in two stat stores.
:- func to_assoc_list(stat) = assoc_list(statkey, int).
% :- import_module pprint.
% :- func to_doc(stat::in) = (doc::out) is det.
:- func plain_to_string(stat::in) = (string::out) is det.
:- func to_string(stat::in) = (string::out) is det.
:- func subs_to_string(stat::in) = (string::out) is det.
%% Other useful predicates for evaluating something
:- func minavgmax_string(list(int)::in) = (string::out) is det.
:- implementation.
:- import_module bag.
:- import_module pair.
:- import_module solutions.
:- type stat == bag(list(string)).
init = bag.init.
blank = construct_bug_helper_1.init.
count(Elem, InStat, OutStat) :-
bag.insert(Elem, InStat, OutStat).
count(Count, Elem, InStat, OutStat) :-
bag.insert_list(list.duplicate(Count, Elem), InStat, OutStat).
count_more(Elem, Count, InStat, OutStat) :-
count(Count, Elem, InStat, OutStat).
count(Elem, InStat) = OutStat :-
count(Elem, InStat, OutStat).
count(Count, Elem, InStat) = OutStat :-
count(Count, Elem, InStat, OutStat).
union(A, B) = bag.union(A, B).
to_assoc_list(Stat) = bag.to_assoc_list(Stat).
to_string(Stat) =
"% Base Counts:\n"
++ plain_to_string(Stat)
++ "% Subtotals:\n"
++ plain_to_string(calc_subtotals(Stat)).
subs_to_string(Stat) =
plain_to_string(calc_subtotals(Stat)).
plain_to_string(Stat) = Out :-
Counts = bag.to_assoc_list(Stat),
list.sort(comparator(Stat, 0), Counts, CountsS),
list.map(
( pred((Name - Count)::in, Line::out) is det :-
Line = string.int_to_string(Count) ++ "\t" ++ join_list("-", Name)
), CountsS, Lines),
Out = join_list("\n", Lines) ++ "\n".
:- pred comparator(stat::in, int::in,
pair(statkey, int)::in, pair(statkey, int)::in, comparison_result::out)
is det.
comparator(Stats, Level, (ADescr-ANum), (BDescr-BNum), Out) :-
( if take(Level, ADescr, ALevel) then
( if take(Level, BDescr, BLevel) then
( if count_value(Stats, ALevel) < count_value(Stats, BLevel) then
Out = (>)
else if count_value(Stats, ALevel) > count_value(Stats, BLevel) then
Out = (<)
else
% same value
( if ALevel = BLevel then
comparator(Stats, Level+1, (ADescr-ANum), (BDescr-BNum),
Out)
else if compare((<), ALevel, BLevel) then
Out = (>)
else
Out = (<)
)
)
else
Out = (>)
)
else if take(Level, BDescr, _BLevel) then
Out = (<)
else
Out = (=)
).
:- func calc_subtotals(stat::in) = (stat::out) is det.
calc_subtotals(Stat) = OutStat :-
Counts = bag.to_assoc_list(Stat),
list.foldl(
( pred((Name - Count)::in, InBag::in, OutBag::out) is det :-
aggregate(substarts(Name), count(Count), InBag, OutBag)
), Counts, Stat, OutStat).
/*
** buggy pprint, do not use.
to_string(Stat) = Str :-
Str = pprint.to_string(150, construct_bug_submodule.to_doc(Stat)).
to_doc(Stat) =
text("% Base Counts:\n")
`<>` plain_to_doc(Stat)
`</>`
text("% Subtotals:\n")
`<>` subtotals_to_doc(Stat).
:- func plain_to_doc(stat::in) = (doc::out) is det.
:- func subtotals_to_doc(stat::in) = (doc::out) is det.
plain_to_doc(Stat) = Out :-
Counts = bag.to_assoc_list(Stat),
Out =
% text("% Statistiky") `</>`
separated(
(func((Name-Count)::in) = (Doc::out) is det :-
Doc = to_doc(Count) `<>` text("\t")
`<>` text(join("-", Name))
), line, Counts)
`<>` line.
subtotals_to_doc(Stat) = Out :-
Counts = bag.to_assoc_list(Stat),
list.foldl(
( pred((Name - Count)::in, InBag::in, OutBag::out) is det :-
aggregate(substarts(Name), count(Count), InBag, OutBag)
), Counts, Stat, Subtotals),
Out = plain_to_doc(Subtotals).
*/
:- pred substarts(list(T)::in, list(T)::out) is multi.
substarts([], []).
substarts([_LastElem], []).
substarts([Elem1, Elem2 | Rest], Out) :-
(
Out = []
;
substarts([Elem2 | Rest], TOut),
Out = [Elem1 | TOut]
).
:- import_module float.
minavgmax_string(List) = Str :-
(
List = [],
Min = "-", Avg = "-", Max = "-"
;
List = [H | Tail],
list.foldl3(
( pred(N::in, MinSoFar::in, NewMin::out, MaxSoFar::in, NewMax::out,
SumSoFar::in, NewSum::out) is det:-
NewSum = SumSoFar + N,
NewMin = (if N < MinSoFar then N else MinSoFar),
NewMax = (if N > MaxSoFar then N else MaxSoFar)
), Tail, H, MinN, H, MaxN, H, SumN),
Min = int_to_string(MinN),
Max = int_to_string(MaxN),
Prec = float(10),
Avg = float_to_string(float(round_to_int(
(float(SumN) / float(length(List))) * Prec)) / Prec)
),
Str = int_to_string(length(List)) ++ ":"
++ Min ++ "/" ++ Avg ++ "/" ++ Max.