-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathsort_lib_test.f90.erb
129 lines (109 loc) · 3.84 KB
/
sort_lib_test.f90.erb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
<%
def enlarge(sml_n, scale)
sml_n\
.map{|array| array\
.map{|n| n*scale}}\
.map{|array| [array, array.sort]}
end
SCALE_UNI = 1
SCALE_I = 2**31 - 1
SCALE_F = 3.402823E+38
SML = [-1, 0, 1]
SML_SETS = [
SML.product(SML),
SML.product(SML, SML),
SML.product(SML, SML, SML),
SML.product(SML, SML, SML, SML),
]
SORTS = [:quick, :merge, :insertion]
%>
#include "fortran_lib.h"
program sort_lib_test
USE_FORTRAN_LIB_H
use, intrinsic:: iso_fortran_env, only: OUTPUT_UNIT, REAL64, INT64, INT32, REAL32
use, non_intrinsic:: constant_lib, only: get_infinity
use, non_intrinsic:: comparable_lib, only: almost_equal
use, non_intrinsic:: random_lib, only: random_seed_by_time
use, non_intrinsic:: array_lib, only: get
use, non_intrinsic:: sort_lib
implicit none
Integer:: i
Integer, allocatable:: seeds(:)
Integer:: nDArray
Real(kind = REAL64), allocatable:: dArray(:), sortedDArray(:)
Integer(kind=INT32):: iSelect, nSelect, iSelect_
Integer(kind=INT32):: iMedian, nMedian
Real(kind=REAL32):: rMedian(101)
call random_seed_by_time(seeds)
PRINT_VARIABLE(seeds)
TEST(almost_equal(median([1, 2, 3, 4]), 2.5))
TEST(almost_equal(median([1, 2, 3, 4, 5]), 3.0))
TEST(almost_equal(median([1]), 1.0))
do nMedian = 1, 100
if(mod(nMedian, 2) == 1)then
ASSERT(almost_equal(median([(iMedian, iMedian = nMedian, 1, -1)]), real(nMedian/2 + 1, kind=REAL32)))
else
ASSERT(almost_equal(median([(iMedian, iMedian = 1, nMedian)]), real(nMedian/2, kind=REAL32) + real(5e-1, kind=REAL32)))
end if
end do
call random_number(rMedian)
ASSERT(almost_equal(median(rMedian), get(quick_sort(rMedian), 51)))
do nSelect = 1, 100
do iSelect = 1, nSelect
ASSERT(select([(iSelect_, iSelect_ = nSelect, 1, -1)], iSelect) == iSelect)
ASSERT(select([(iSelect_, iSelect_ = 1, nSelect)], iSelect) == iSelect)
end do
end do
! size 0
<% SORTS.each{|name| %>
TEST(size(<%= name %>_sort([(i, i = 1, 0)])) == 0)
TEST(size(<%= name %>_sort([(dble(i), i = 1, 0)])) == 0)
<% } %>
! size 1
<% SORTS.each{|name| %>
TEST(all(<%= name %>_sort([0]) == [0]))
TEST(all(almost_equal(<%= name %>_sort([0.0]), [0.0])))
<% } %>
<% SORTS.each{|name| %>
<% [SML_SETS.last].each{|sml_set| %>
<% enlarge(sml_set, SCALE_UNI).each{|input, sorted| %>
TEST(all(<%= name %>_sort(<%= input.inspect %>) == <%= sorted.inspect %>))
<% } %>
<% enlarge(sml_set, SCALE_I).each{|input, sorted| %>
TEST(all(<%= name %>_sort(<%= input.inspect %>) == <%= sorted.inspect %>))
<% } %>
<% enlarge(sml_set, SCALE_F).each{|input, sorted| %>
TEST(all(almost_equal(<%= name %>_sort(<%= input.inspect %>), <%= sorted.inspect %>)))
<% } %>
<% } %>
<% } %>
do nDArray = 1, 2049
allocate(dArray(nDArray))
call random_number(dArray)
dArray = dArray*0.01 - 0.005
<% SORTS.each{|name| %>
sortedDArray = <%= name %>_sort(dArray)
ASSERT(all(sortedDArray(1:nDArray - 1) <= sortedDArray(2:nDArray)))
<% } %>
deallocate(dArray)
end do
nDArray = 10000
allocate(dArray(nDArray))
call random_number(dArray)
dArray = dArray*0.01 - 0.005
<% SORTS.each{|name| %>
sortedDArray = <%= name %>_sort(dArray)
TEST(all(sortedDArray(1:nDArray - 1) <= sortedDArray(2:nDArray)))
<% } %>
deallocate(dArray)
! Infinity
<% SORTS.each{|name| %>
TEST(all(almost_equal(<%= name %>_sort([0.0, get_infinity(), -get_infinity()]), [-get_infinity(), 0.0, get_infinity()])))
<% } %>
! Bug check
<% SORTS.each{|name| %>
TEST(all(almost_equal(<%= name %>_sort([0.992602646, 0.992602706]), [0.992602646, 0.992602706])))
<% } %>
write(OUTPUT_UNIT, *) 'SUCCESS: ', __FILE__
stop
end program sort_lib_test