File: test_convol.pro

package info (click to toggle)
gnudatalanguage 1.1.1-3
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 80,368 kB
  • sloc: cpp: 189,797; ansic: 46,721; sh: 677; python: 474; makefile: 146; xml: 69; f90: 28
file content (141 lines) | stat: -rw-r--r-- 6,664 bytes parent folder | download | duplicates (2)
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
130
131
132
133
134
135
136
137
138
139
140
141
;---- to test the exactitude of the result ----
;---- Apr 2022, Jingwei WANG
;
PRO TEST_CONVOL_RES, cumul_errors, quiet=quiet, verbose=verbose, test=test, help=help

  if KEYWORD_SET(help) then begin
    print, 'pro TEST_CONVOL_RES, cumul_errors=0, quiet=quiet, verbose=verbose, test=test, help=help'
    return
  endif 

  nb_pbs_convol=0
  kern= [[-1,6,6,-1],[6,61,61,6],[13,125,125,13],[6,61,61,6],[-1,6,6,-1]]
  array =  [[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], [16,27,28,29,30]]
  
  ; expected results
  expected_result = [[0,0,0,0,0], [0,0,0,0,0], [0,0,7050,7614,0], [0,0,9880,10434,0], [0,0,0,0,0], [0,0,0,0,0]]
  expected_result_edge_zero = [[613,1380,1820,2240,2532],[1736,3591,4255,4809,5109],[3125,6256,7050,7614,7810],[4475,8901,9880,10434,10515],[5181,10711,12305,12919,12839],[3843,8680,10650,11200,11082]]
  expected_result_edge_wrap = [[5402,4671,5670,6294,6683],[4752,4021,4540,5094,5553],[7332,6601,7050,7614,8063],[10092,9361,9880,10434,10893],[12062,11331,12330,12954,13343],[10222,9491,11060,11754,12073]]
  expected_result_edge_mirror = [[1430,1689,2230,2794,3335],[3480,3739,4280,4844,5385],[6250,6509,7050,7614,8155],[8950,9279,9880,10434,10975],[10500,11379,12590,13204,13745],[10170,12099,14500,15254,15795]]
  expected_result_edge_truncate = [[1357,1639,2180,2744,3285],[3457,3739,4280,4844,5385],[6227,6509,7050,7614,8155],[8937,9279,9880,10434,10975],[10427,11379,12590,13204,13745],[9897,12099,14560,15304,15845]]
  expected_result_edge_constant0 = expected_result_edge_zero
  expected_result_edge_constant1 = [[967,1542,1964,2384,2694],[2023,3625,4265,4819,5143],[3407,6279,7050,7614,7833],[4757,8924,9880,10434,10538],[5468,10745,12315,12929,12873],[4197,8842,10794,11344,11244]]
  
  ; real results
  result = CONVOL(array, kern)
  result_edge_zero = CONVOL(array, kern, /EDGE_ZERO)
  result_edge_wrap = CONVOL(array, kern, /EDGE_WRAP)
  result_edge_mirror = CONVOL(array, kern, /EDGE_MIRROR)
  result_edge_truncate = CONVOL(array, kern, /EDGE_TRUNCATE)
  result_edge_constant0 = CONVOL(array, kern, EDGE_CONSTANT=0) ; which should equal to /edge_zero
  result_edge_constant1 = CONVOL(array, kern, EDGE_CONSTANT=1)
; here one can test the different arrays...

  IF ARRAY_EQUAL(result, expected_result,/NOT_EQUAL) THEN ERRORS_ADD, nb_pbs_convol, 'case (a,k)'
  IF ARRAY_EQUAL(result_edge_zero, expected_result_edge_zero,/NOT_EQUAL) THEN ERRORS_ADD, nb_pbs_convol, 'case edge_zero'
  IF ARRAY_EQUAL(result_edge_wrap, expected_result_edge_wrap,/NOT_EQUAL) THEN ERRORS_ADD, nb_pbs_convol, 'case edge_wrap'
  IF ARRAY_EQUAL(result_edge_mirror, expected_result_edge_mirror,/NOT_EQUAL) THEN ERRORS_ADD, nb_pbs_convol, 'case edge_mirror'
  IF ARRAY_EQUAL(result_edge_constant0, expected_result_edge_constant0,/NOT_EQUAL) THEN ERRORS_ADD, nb_pbs_convol, 'case edge_constant=0'
  IF ARRAY_EQUAL(result_edge_constant1, expected_result_edge_constant1,/NOT_EQUAL) THEN ERRORS_ADD, nb_pbs_convol, 'case edge_constant=1'
;
ERRORS_CUMUL, cumul_errors, nb_pbs_convol
if ~KEYWORD_SET(quiet) then BANNER_FOR_TESTSUITE, 'TEST_CONVOL_RES', nb_pbs_convol
;
if KEYWORD_SET(test) then STOP
;
END

PRO SUB_TEST_CONVOL, a, kern, plot=plot
  n=0 
  if (n_elements(plot) eq 0) then plot=0
  if plot then TVSCL, a, n
  result = CONVOL( a, kern) & if (plot) then TVSCL, result,n++ 
  result = CONVOL( a, kern, /EDGE_ZERO ) & if (plot) then TVSCL, result,n++ 
  result = CONVOL( a, kern, /EDGE_WRAP ) & if (plot) then TVSCL, result,n++ 
  result = CONVOL( a, kern, /EDGE_TRUNCATE ) & if (plot) then TVSCL, result,n++ 
  result = CONVOL( a, kern, /EDGE_MIRROR   ) & if (plot) then TVSCL, result,n++

  result = CONVOL( a, kern, /EDGE_ZERO     ,INVALID=255) & if (plot) then TVSCL, result,n++ 
  result = CONVOL( a, kern, /EDGE_WRAP     ,INVALID=255) & if (plot) then TVSCL, result,n++ 
  result = CONVOL( a, kern, /EDGE_TRUNCATE ,INVALID=255) & if (plot) then TVSCL, result,n++ 
  result = CONVOL( a, kern, /EDGE_MIRROR   ,INVALID=255) & if (plot) then TVSCL, result,n++

  result = CONVOL( a, kern, /EDGE_ZERO     ,INVALID=255, MISSING=0) & if (plot) then TVSCL, result,n++ 
  result = CONVOL( a, kern, /EDGE_WRAP     ,INVALID=255, MISSING=0) & if (plot) then TVSCL, result,n++ 
  result = CONVOL( a, kern, /EDGE_TRUNCATE ,INVALID=255, MISSING=0) & if (plot) then TVSCL, result,n++ 
  result = CONVOL( a, kern, /EDGE_MIRROR   ,INVALID=255, MISSING=0) & if (plot) then TVSCL, result,n++

  result = CONVOL( a, kern, /EDGE_ZERO     ,INVALID=255, MISSING=0, /NORMALIZE) & if (plot) then TVSCL, result,n++ 
  result = CONVOL( a, kern, /EDGE_WRAP     ,INVALID=255, MISSING=0, /NORMALIZE) & if (plot) then TVSCL, result,n++ 
  result = CONVOL( a, kern, /EDGE_TRUNCATE ,INVALID=255, MISSING=0, /NORMALIZE) & if (plot) then TVSCL, result,n++ 
  result = CONVOL( a, kern, /EDGE_MIRROR   ,INVALID=255, MISSING=0, /NORMALIZE) & if (plot) then TVSCL, result,n++

  result = CONVOL( a, kern, /EDGE_ZERO     ,INVALID=255, MISSING=0, /NORMALIZE, /NAN) & if (plot) then TVSCL, result,n++ 
  result = CONVOL( a, kern, /EDGE_WRAP     ,INVALID=255, MISSING=0, /NORMALIZE, /NAN) & if (plot) then TVSCL, result,n++ 
  result = CONVOL( a, kern, /EDGE_TRUNCATE ,INVALID=255, MISSING=0, /NORMALIZE, /NAN) & if (plot) then TVSCL, result,n++ 
  result = CONVOL( a, kern, /EDGE_MIRROR   ,INVALID=255, MISSING=0, /NORMALIZE, /NAN) & if (plot) then TVSCL, result,n++

END




PRO TEST_CONVOL, cumul_errors, plot=plot, test=test, help=help
;
  if KEYWORD_SET(help) then begin
    print, 'PRO TEST_CONVOL, cumul_errors, plot=plot, test=test, help=help'
    return
  endif 

cumul_errors = 0
TEST_CONVOL_RES, cumul_errors, quiet=1
;
  kern= [[-1,6,13,6,-1],[6,61,125,61,6],[13,125,253,125,13],[6,61,125,61,6],[-1,6,13,6,-1]]
; kern=congrid(kern,21,21)

  array = [DIST(100,100)]*0.003 + 0.1*RANDOMN(s,300,300) 
  fact=max(array)
  barray = BYTSCL( array, TOP=254 ) 
  barray[*, RANDOMU(s,40)*300] = 255 
  barray[*, 10:20] = 255 

  uiarray = UINT(array/fact*32768) 
  uiarray[*, RANDOMU(s,40)*300] = 255 
  uiarray[*, 10:20] = 255 

  iarray = FIX( array/fact*32768) 
  iarray[*, RANDOMU(s,40)*300] = 255 
  iarray[*, 10:20] = 255 

  array[*, RANDOMU(s,40)*300] = 255 
  array[*, 10:20] = 255 

  nanarray=array
  nanarray[*, RANDOMU(s,40)*300] = !values.f_nan 
  nanarray[*, 10:20] = !values.f_nan

; here one can test the different arrays...

  sub_test_convol,array,kern,plot=plot
  sub_test_convol,iarray,kern,plot=plot
  sub_test_convol,uiarray,kern,plot=plot
  sub_test_convol,barray,kern,plot=plot

  sub_test_convol,nanarray,kern,plot=plot

;
BANNER_FOR_TESTSUITE, 'TEST_CONVOL', cumul_errors
;
if KEYWORD_SET(test) then STOP
;
END