[m-rev.] diff: fix relation.tsort
Simon Taylor
stayl at cs.mu.OZ.AU
Wed Dec 24 08:50:48 AEDT 2003
Estimated hours taken: 2
Branches: main
library/relation.m:
Fix a bug in my last change which broke the Aditi tests;
the output of tsort was in reverse order.
tests/hard_coded/relation_test.m:
Add some more test cases.
Index: library//relation.m
===================================================================
RCS file: /home/mercury1/repository/mercury/library/relation.m,v
retrieving revision 1.31
diff -u -u -r1.31 relation.m
--- library//relation.m 22 Dec 2003 11:21:48 -0000 1.31
+++ library//relation.m 23 Dec 2003 21:44:44 -0000
@@ -730,7 +730,7 @@
relation__lookup_key_set_from(Rel, Node, AdjSet),
insert(!.Visit, Node, !:Visit),
- % Go and visit all a nodes children first
+ % Go and visit all of the node's children first
{!:Visit, !:DfsRev} = foldl(
(func(Adj, {!.Visit, !.DfsRev}) =
{!:Visit, !:DfsRev} :-
@@ -927,17 +927,9 @@
% relation__tsort returns a topological sorting
% of a relation. It fails if the relation is cyclic.
relation__tsort(Rel, Tsort) :-
- relation__tsort_2(Rel, Tsort0),
- list__map(relation__lookup_key(Rel), Tsort0, Tsort).
-
-:- pred relation__tsort_2(relation(T), list(relation_key)).
-:- mode relation__tsort_2(in, out) is semidet.
-
-relation__tsort_2(Rel, Tsort) :-
- relation__domain_sorted_list(Rel, DomList),
- init(Vis0),
- relation__c_dfs(Rel, DomList, Vis0, _Vis, [], Tsort),
- relation__check_tsort(Rel, Vis0, Tsort).
+ relation__dfsrev(Rel, Tsort0),
+ relation__check_tsort(Rel, init, Tsort0),
+ Tsort = list__map(relation__lookup_key(Rel), Tsort0).
:- pred relation__check_tsort(relation(T), relation_key_set,
list(relation_key)).
@@ -950,31 +942,6 @@
empty(BackPointers),
relation__check_tsort(Rel, Vis1, Xs).
-:- pred relation__c_dfs(relation(T), list(relation_key), relation_key_set,
- relation_key_set, list(relation_key), list(relation_key)).
-:- mode relation__c_dfs(in, in, in, out, in, out) is det.
-relation__c_dfs(_Rel, [], !Vis, !Dfs).
-relation__c_dfs(Rel, [X | Xs], !Vis, !Dfs) :-
- ( contains(!.Vis, X) ->
- true
- ;
- relation__c_dfs_2(Rel, X, !Vis, !Dfs)
- ),
- relation__c_dfs(Rel, Xs, !Vis, !Dfs).
-
-:- pred relation__c_dfs_2(relation(T), relation_key, relation_key_set,
- relation_key_set, list(relation_key), list(relation_key)).
-:- mode relation__c_dfs_2(in, in, in, out, in, out) is det.
-relation__c_dfs_2(Rel, X, !Vis, !Dfs) :-
- insert(!.Vis, X, !:Vis),
- relation__lookup_key_set_from(Rel, X, FromXs),
- foldl(
- (pred(FromX::in, {!.Vis, !.Dfs}::in,
- {!:Vis, !:Dfs}::out) is det :-
- relation__c_dfs_2(Rel, FromX, !Vis, !Dfs)
- ), FromXs, {!.Vis, !.Dfs}, {!:Vis, !:Dfs}),
- !:Dfs = [X | !.Dfs].
-
%------------------------------------------------------------------------------%
% relation__atsort returns a topological sorting
@@ -993,8 +960,7 @@
list__reverse(ATsort0, ATsort).
:- pred relation__atsort_2(list(relation_key), relation(T),
- relation_key_set, list(set(T)),
- list(set(T))).
+ relation_key_set, list(set(T)), list(set(T))).
:- mode relation__atsort_2(in, in, in, in, out) is det.
relation__atsort_2([], _, _, ATsort, ATsort).
Index: tests/hard_coded/relation_test.exp
===================================================================
RCS file: /home/mercury1/repository/tests/hard_coded/relation_test.exp,v
retrieving revision 1.2
diff -u -u -r1.2 relation_test.exp
--- tests/hard_coded/relation_test.exp 22 Dec 2003 11:21:49 -0000 1.2
+++ tests/hard_coded/relation_test.exp 23 Dec 2003 04:32:12 -0000
@@ -1,62 +1,118 @@
Rel =
"a" - "b"
-"b" - "c"
-"c" - "d"
-"l1" - "l2"
-"l2" - "l3"
-"l3" - "l1"
-"x" - "x"
+ "b" - "c"
+ "c" - "d"
+ "l1" - "l2"
+ "l2" - "l3"
+ "l3" - "l1"
+ "x" - "x"
-tc of Rel =
+tc =
"a" - "b"
-"a" - "c"
-"a" - "d"
-"b" - "c"
-"b" - "d"
-"c" - "d"
-"l1" - "l1"
-"l1" - "l2"
-"l1" - "l3"
-"l2" - "l1"
-"l2" - "l2"
-"l2" - "l3"
-"l3" - "l1"
-"l3" - "l2"
-"l3" - "l3"
-"x" - "x"
+ "a" - "c"
+ "a" - "d"
+ "b" - "c"
+ "b" - "d"
+ "c" - "d"
+ "l1" - "l1"
+ "l1" - "l2"
+ "l1" - "l3"
+ "l2" - "l1"
+ "l2" - "l2"
+ "l2" - "l3"
+ "l3" - "l1"
+ "l3" - "l2"
+ "l3" - "l3"
+ "x" - "x"
-rtc of Rel =
+rtc =
"a" - "a"
+ "a" - "b"
+ "a" - "c"
+ "a" - "d"
+ "b" - "b"
+ "b" - "c"
+ "b" - "d"
+ "c" - "c"
+ "c" - "d"
+ "d" - "d"
+ "l1" - "l1"
+ "l1" - "l2"
+ "l1" - "l3"
+ "l2" - "l1"
+ "l2" - "l2"
+ "l2" - "l3"
+ "l3" - "l1"
+ "l3" - "l2"
+ "l3" - "l3"
+ "x" - "x"
+
+sc =
"a" - "b"
-"a" - "c"
-"a" - "d"
-"b" - "b"
-"b" - "c"
-"b" - "d"
-"c" - "c"
-"c" - "d"
-"d" - "d"
-"l1" - "l1"
-"l1" - "l2"
-"l1" - "l3"
-"l2" - "l1"
-"l2" - "l2"
-"l2" - "l3"
-"l3" - "l1"
-"l3" - "l2"
-"l3" - "l3"
-"x" - "x"
+ "b" - "a"
+ "b" - "c"
+ "c" - "b"
+ "c" - "d"
+ "d" - "c"
+ "l1" - "l2"
+ "l1" - "l3"
+ "l2" - "l1"
+ "l2" - "l3"
+ "l3" - "l1"
+ "l3" - "l2"
+ "x" - "x"
+dfs =
+["d", "c", "b", "a", "l3", "l2", "l1", "x"]
+atsort =
+[["x"], ["l1", "l2", "l3"], ["a"], ["b"], ["c"], ["d"]]
+tsort failed
+is_dag failed
Rel2 =
"a" - "a1"
-"b" - "b1"
-"c" - "c1"
-"d" - "d1"
+ "b" - "b1"
+ "c" - "c1"
+ "d" - "d1"
+
+tc =
+"a" - "a1"
+ "b" - "b1"
+ "c" - "c1"
+ "d" - "d1"
+
+rtc =
+"a" - "a"
+ "a" - "a1"
+ "a1" - "a1"
+ "b" - "b"
+ "b" - "b1"
+ "b1" - "b1"
+ "c" - "c"
+ "c" - "c1"
+ "c1" - "c1"
+ "d" - "d"
+ "d" - "d1"
+ "d1" - "d1"
+
+sc =
+"a" - "a1"
+ "a1" - "a"
+ "b" - "b1"
+ "b1" - "b"
+ "c" - "c1"
+ "c1" - "c"
+ "d" - "d1"
+ "d1" - "d"
-composition of Rel1 and Rel2 =
+dfs =
+["a1", "a", "b1", "b", "c1", "c", "d1", "d"]
+atsort =
+[["d"], ["d1"], ["c"], ["c1"], ["b"], ["b1"], ["a"], ["a1"]]
+tsort =
+["d", "d1", "c", "c1", "b", "b1", "a", "a1"]
+is_dag succeeded
+composition of Rel and Rel2 =
"a" - "b1"
-"b" - "c1"
-"c" - "d1"
+ "b" - "c1"
+ "c" - "d1"
-relation__is_dag(Rel) failed as expected
-relation__is_dag(Rel) succeeded
Index: tests/hard_coded/relation_test.m
===================================================================
RCS file: /home/mercury1/repository/tests/hard_coded/relation_test.m,v
retrieving revision 1.2
diff -u -u -r1.2 relation_test.m
--- tests/hard_coded/relation_test.m 22 Dec 2003 11:21:49 -0000 1.2
+++ tests/hard_coded/relation_test.m 23 Dec 2003 04:26:59 -0000
@@ -23,24 +23,38 @@
"c" - "c1",
"d" - "d1"],
Rel2) },
+ test_rel("Rel", Rel),
+ test_rel("Rel2", Rel2),
+ { relation__compose(Rel, Rel2, ComposedRel) },
+ print("composition of Rel and Rel2 ="), nl,
+ print_rel(ComposedRel), nl.
+
+:- pred test_rel(string::in, relation(T)::in,
+ io__state::di, io__state::uo) is det.
+
+test_rel(Name, Rel) -->
+ { relation__dfs(Rel, DfsKeys) },
+ { list__map(relation__lookup_key(Rel), DfsKeys, Dfs) },
{ relation__tc(Rel, TC_Rel) },
{ relation__rtc(Rel, RTC_Rel) },
- { relation__compose(Rel, Rel2, ComposedRel) },
- print("Rel ="), nl, print_rel(Rel), nl,
- print("tc of Rel ="), nl, print_rel(TC_Rel), nl,
- print("rtc of Rel ="), nl, print_rel(RTC_Rel), nl,
- print("Rel2 ="), nl, print_rel(Rel2), nl,
- print("composition of Rel1 and Rel2 ="), nl,
- print_rel(ComposedRel), nl,
- ( { relation__is_dag(Rel) } ->
- io__write_string("Error: relation__is_dag(Rel) succeeded\n")
+ { relation__sc(Rel, SC_Rel) },
+ { relation__atsort(Rel, ATSort) },
+ print(Name),
+ print(" ="), nl, print_rel(Rel), nl,
+ print("tc ="), nl, print_rel(TC_Rel), nl,
+ print("rtc ="), nl, print_rel(RTC_Rel), nl,
+ print("sc ="), nl, print_rel(SC_Rel), nl,
+ print("dfs ="), nl, print(Dfs), nl,
+ print("atsort ="), nl, print(ATSort), nl,
+ ( { relation__tsort(Rel, TSort) } ->
+ print("tsort ="), nl, print(TSort), nl
;
- io__write_string("relation__is_dag(Rel) failed as expected\n")
+ print("tsort failed\n")
),
- ( { relation__is_dag(Rel2) } ->
- io__write_string("relation__is_dag(Rel) succeeded\n")
+ ( { relation__is_dag(Rel) } ->
+ io__write_string("is_dag succeeded\n")
;
- io__write_string("Error: relation__is_dag(Rel2) failed\n")
+ io__write_string("is_dag failed\n")
).
:- pred print_rel(relation(T), state, state).
@@ -49,5 +63,5 @@
print_rel(Relation) -->
{ relation__to_assoc_list(Relation, AssocList0) },
{ list__sort(AssocList0, AssocList) },
- write_list(AssocList, "\n", print), nl.
+ write_list(AssocList, "\n\t", print), nl.
--------------------------------------------------------------------------
mercury-reviews mailing list
post: mercury-reviews at cs.mu.oz.au
administrative address: owner-mercury-reviews at cs.mu.oz.au
unsubscribe: Address: mercury-reviews-request at cs.mu.oz.au Message: unsubscribe
subscribe: Address: mercury-reviews-request at cs.mu.oz.au Message: subscribe
--------------------------------------------------------------------------
More information about the reviews
mailing list