@@ -35,18 +35,13 @@ pure module function topological_sort(dag) result(order)
35
35
36
36
block
37
37
type (searched_and_ordered_t) searched_and_ordered
38
- integer , allocatable :: discovered(:)
39
38
integer v
40
39
41
- allocate (discovered(0 ))
42
40
searched_and_ordered = searched_and_ordered_t(s = [integer :: ], o = [integer :: ])
43
41
44
42
do v = 1 , size (dag% vertices)
45
- if (.not. any (v == searched_and_ordered% s)) then
43
+ if (.not. any (v == searched_and_ordered% s)) &
46
44
searched_and_ordered = depth_first_search(v, [integer :: ], searched_and_ordered% o)
47
- discovered = [discovered, searched_and_ordered% s]
48
- searched_and_ordered% s= discovered
49
- end if
50
45
end do
51
46
order = searched_and_ordered% o
52
47
end block
@@ -60,22 +55,21 @@ pure recursive function depth_first_search(v, d, o) result(hybrid)
60
55
61
56
call assert(.not. any (v == d), " depth_first_search: cycle detected" , intrinsic_array_t([v,d]))
62
57
63
- block
64
- integer , allocatable :: dependencies(:)
65
- integer w
66
-
67
- hybrid = searched_and_ordered_t(s = [integer :: ], o = o)
68
- dependencies = dag% depends_on(v)
69
-
70
- do concurrent(w = 1 :size (dependencies))
71
- associate(w_dependencies = > dependencies(w))
72
- if (.not. any (w_dependencies == hybrid% s)) hybrid = depth_first_search(w_dependencies, [d, v], hybrid% o)
73
- end associate
74
- end do
75
-
76
- if (.not. any (v == hybrid% o)) hybrid% o = [v, hybrid% o]
77
- hybrid = searched_and_ordered_t(s = [v, hybrid% s], o = hybrid% o)
78
- end block
58
+ hybrid = searched_and_ordered_t(s = [integer :: ], o = o)
59
+
60
+ associate(dependencies = > dag% depends_on(v))
61
+ block
62
+ integer w
63
+ do concurrent(w = 1 :size (dependencies))
64
+ associate(w_dependencies = > dependencies(w))
65
+ if (.not. any (w_dependencies == hybrid% s)) hybrid = depth_first_search(w_dependencies, [d, v], hybrid% o)
66
+ end associate
67
+ end do
68
+ end block
69
+ end associate
70
+
71
+ if (.not. any (v == hybrid% o)) hybrid% o = [v, hybrid% o]
72
+ hybrid = searched_and_ordered_t(s = [v, hybrid% s], o = hybrid% o)
79
73
80
74
end function
81
75
0 commit comments