@@ -28,18 +28,15 @@ type JSDivergence <: SemiMetric end
28
28
29
29
type SpanNormDist <: SemiMetric end
30
30
31
- typealias UnionMetrics @compat (Union{Euclidean, SqEuclidean, Chebyshev, Cityblock, Minkowski, Hamming, Jaccard, RogersTanimoto, CosineDist, CorrDist, ChiSqDist, KLDivergence, JSDivergence, SpanNormDist})
31
+
32
+ typealias UnionMetrics Union{Euclidean, SqEuclidean, Chebyshev, Cityblock, Minkowski, Hamming, Jaccard, RogersTanimoto, CosineDist, CorrDist, ChiSqDist, KLDivergence, JSDivergence, SpanNormDist}
32
33
33
34
# ##########################################################
34
35
#
35
36
# Define Evaluate
36
37
#
37
38
# ##########################################################
38
39
39
- if VERSION < v " 0.4.0-dev+1624"
40
- eachindex (A:: AbstractArray... ) = 1 : length (A[1 ])
41
- end
42
-
43
40
function evaluate (d:: UnionMetrics , a:: AbstractArray , b:: AbstractArray )
44
41
if length (a) != length (b)
45
42
throw (DimensionMismatch (" first array has length $(length (a)) which does not match the length of the second, $(length (b)) ." ))
@@ -72,52 +69,52 @@ eval_end(d::UnionMetrics, s) = s
72
69
evaluate {T <: Number} (dist:: UnionMetrics , a:: T , b:: T ) = eval_end (dist, eval_op (dist, a, b))
73
70
74
71
# SqEuclidean
75
- @compat @ inline eval_op (:: SqEuclidean , ai, bi) = abs2 (ai - bi)
76
- @compat @ inline eval_reduce (:: SqEuclidean , s1, s2) = s1 + s2
72
+ @inline eval_op (:: SqEuclidean , ai, bi) = abs2 (ai - bi)
73
+ @inline eval_reduce (:: SqEuclidean , s1, s2) = s1 + s2
77
74
78
75
sqeuclidean (a:: AbstractArray , b:: AbstractArray ) = evaluate (SqEuclidean (), a, b)
79
76
sqeuclidean {T <: Number} (a:: T , b:: T ) = evaluate (SqEuclidean (), a, b)
80
77
81
78
# Euclidean
82
- @compat @ inline eval_op (:: Euclidean , ai, bi) = abs2 (ai - bi)
83
- @compat @ inline eval_reduce (:: Euclidean , s1, s2) = s1 + s2
79
+ @inline eval_op (:: Euclidean , ai, bi) = abs2 (ai - bi)
80
+ @inline eval_reduce (:: Euclidean , s1, s2) = s1 + s2
84
81
eval_end (:: Euclidean , s) = sqrt (s)
85
82
euclidean (a:: AbstractArray , b:: AbstractArray ) = evaluate (Euclidean (), a, b)
86
83
euclidean (a:: Number , b:: Number ) = evaluate (Euclidean (), a, b)
87
84
88
85
# Cityblock
89
- @compat @ inline eval_op (:: Cityblock , ai, bi) = abs (ai - bi)
90
- @compat @ inline eval_reduce (:: Cityblock , s1, s2) = s1 + s2
86
+ @inline eval_op (:: Cityblock , ai, bi) = abs (ai - bi)
87
+ @inline eval_reduce (:: Cityblock , s1, s2) = s1 + s2
91
88
cityblock (a:: AbstractArray , b:: AbstractArray ) = evaluate (Cityblock (), a, b)
92
89
cityblock {T <: Number} (a:: T , b:: T ) = evaluate (Cityblock (), a, b)
93
90
94
91
# Chebyshev
95
- @compat @ inline eval_op (:: Chebyshev , ai, bi) = abs (ai - bi)
96
- @compat @ inline eval_reduce (:: Chebyshev , s1, s2) = max (s1, s2)
92
+ @inline eval_op (:: Chebyshev , ai, bi) = abs (ai - bi)
93
+ @inline eval_reduce (:: Chebyshev , s1, s2) = max (s1, s2)
97
94
# if only NaN, will output NaN
98
- @compat @ inline eval_start (:: Chebyshev , a:: AbstractArray , b:: AbstractArray ) = abs (a[1 ] - b[1 ])
95
+ @inline eval_start (:: Chebyshev , a:: AbstractArray , b:: AbstractArray ) = abs (a[1 ] - b[1 ])
99
96
chebyshev (a:: AbstractArray , b:: AbstractArray ) = evaluate (Chebyshev (), a, b)
100
97
chebyshev {T <: Number} (a:: T , b:: T ) = evaluate (Chebyshev (), a, b)
101
98
102
99
# Minkowski
103
- @compat @ inline eval_op (dist:: Minkowski , ai, bi) = abs (ai - bi) .^ dist. p
104
- @compat @ inline eval_reduce (:: Minkowski , s1, s2) = s1 + s2
100
+ @inline eval_op (dist:: Minkowski , ai, bi) = abs (ai - bi) .^ dist. p
101
+ @inline eval_reduce (:: Minkowski , s1, s2) = s1 + s2
105
102
eval_end (dist:: Minkowski , s) = s .^ (1 / dist. p)
106
103
minkowski (a:: AbstractArray , b:: AbstractArray , p:: Real ) = evaluate (Minkowski (p), a, b)
107
104
minkowski {T <: Number} (a:: T , b:: T , p:: Real ) = evaluate (Minkowski (p), a, b)
108
105
109
106
# Hamming
110
- @compat @ inline eval_op (:: Hamming , ai, bi) = ai != bi ? 1 : 0
111
- @compat @ inline eval_reduce (:: Hamming , s1, s2) = s1 + s2
107
+ @inline eval_op (:: Hamming , ai, bi) = ai != bi ? 1 : 0
108
+ @inline eval_reduce (:: Hamming , s1, s2) = s1 + s2
112
109
hamming (a:: AbstractArray , b:: AbstractArray ) = evaluate (Hamming (), a, b)
113
110
hamming {T <: Number} (a:: T , b:: T ) = evaluate (Hamming (), a, b)
114
111
115
112
# Cosine dist
116
113
function eval_start {T<:AbstractFloat} (:: CosineDist , a:: AbstractArray{T} , b:: AbstractArray{T} )
117
114
zero (T), zero (T), zero (T)
118
115
end
119
- @compat @ inline eval_op (:: CosineDist , ai, bi) = ai * bi, ai * ai, bi * bi
120
- @compat @ inline function eval_reduce (:: CosineDist , s1, s2)
116
+ @inline eval_op (:: CosineDist , ai, bi) = ai * bi, ai * ai, bi * bi
117
+ @inline function eval_reduce (:: CosineDist , s1, s2)
121
118
a1, b1, c1 = s1
122
119
a2, b2, c2 = s2
123
120
return a1 + a2, b1 + b2, c1 + c2
@@ -135,32 +132,32 @@ corr_dist(a::AbstractArray, b::AbstractArray) = evaluate(CorrDist(), a, b)
135
132
result_type (:: CorrDist , a:: AbstractArray , b:: AbstractArray ) = result_type (CosineDist (), a, b)
136
133
137
134
# ChiSqDist
138
- @compat @ inline eval_op (:: ChiSqDist , ai, bi) = abs2 (ai - bi) / (ai + bi)
139
- @compat @ inline eval_reduce (:: ChiSqDist , s1, s2) = s1 + s2
135
+ @inline eval_op (:: ChiSqDist , ai, bi) = abs2 (ai - bi) / (ai + bi)
136
+ @inline eval_reduce (:: ChiSqDist , s1, s2) = s1 + s2
140
137
chisq_dist (a:: AbstractArray , b:: AbstractArray ) = evaluate (ChiSqDist (), a, b)
141
138
142
139
# KLDivergence
143
- @compat @ inline eval_op (:: KLDivergence , ai, bi) = ai > 0 ? ai * log (ai / bi) : zero (ai)
144
- @compat @ inline eval_reduce (:: KLDivergence , s1, s2) = s1 + s2
140
+ @inline eval_op (:: KLDivergence , ai, bi) = ai > 0 ? ai * log (ai / bi) : zero (ai)
141
+ @inline eval_reduce (:: KLDivergence , s1, s2) = s1 + s2
145
142
kl_divergence (a:: AbstractArray , b:: AbstractArray ) = evaluate (KLDivergence (), a, b)
146
143
147
144
# JSDivergence
148
- @compat @ inline function eval_op {T} (:: JSDivergence , ai:: T , bi:: T )
145
+ @inline function eval_op {T} (:: JSDivergence , ai:: T , bi:: T )
149
146
u = (ai + bi) / 2
150
147
ta = ai > 0 ? ai * log (ai) / 2 : zero (log (one (T)))
151
148
tb = bi > 0 ? bi * log (bi) / 2 : zero (log (one (T)))
152
149
tu = u > 0 ? u * log (u) : zero (log (one (T)))
153
150
ta + tb - tu
154
151
end
155
- @compat @ inline eval_reduce (:: JSDivergence , s1, s2) = s1 + s2
152
+ @inline eval_reduce (:: JSDivergence , s1, s2) = s1 + s2
156
153
js_divergence (a:: AbstractArray , b:: AbstractArray ) = evaluate (JSDivergence (), a, b)
157
154
158
155
# SpanNormDist
159
156
function eval_start (:: SpanNormDist , a:: AbstractArray , b:: AbstractArray )
160
157
a[1 ] - b[1 ], a[1 ] - b[1 ]
161
158
end
162
- @compat @ inline eval_op (:: SpanNormDist , ai, bi) = ai - bi
163
- @compat @ inline function eval_reduce (:: SpanNormDist , s1, s2)
159
+ @inline eval_op (:: SpanNormDist , ai, bi) = ai - bi
160
+ @inline function eval_reduce (:: SpanNormDist , s1, s2)
164
161
min_d, max_d = s1
165
162
if s2 > max_d
166
163
max_d = s2
@@ -179,38 +176,38 @@ end
179
176
180
177
# Jaccard
181
178
182
- @compat @ inline eval_start (:: Jaccard , a:: AbstractArray , b:: AbstractArray ) = 0 , 0
183
- @compat @ inline function eval_op (:: Jaccard , s1, s2)
179
+ @inline eval_start (:: Jaccard , a:: AbstractArray , b:: AbstractArray ) = 0 , 0
180
+ @inline function eval_op (:: Jaccard , s1, s2)
184
181
denominator = max (s1, s2)
185
182
numerator = min (s1, s2)
186
183
numerator, denominator
187
184
end
188
- @compat @ inline function eval_reduce (:: Jaccard , s1, s2)
185
+ @inline function eval_reduce (:: Jaccard , s1, s2)
189
186
a = s1[1 ] + s2[1 ]
190
187
b = s1[2 ] + s2[2 ]
191
188
a, b
192
189
end
193
- @compat @ inline eval_end (:: Jaccard , a) = 1 - (a[1 ]/ a[2 ])
190
+ @inline eval_end (:: Jaccard , a) = 1 - (a[1 ]/ a[2 ])
194
191
jaccard (a:: AbstractArray , b:: AbstractArray ) = evaluate (Jaccard (), a, b)
195
192
196
193
# Tanimoto
197
194
198
- @compat @ inline eval_start (:: RogersTanimoto , a:: AbstractArray , b:: AbstractArray ) = 0 , 0 , 0 , 0
199
- @compat @ inline function eval_op (:: RogersTanimoto , s1, s2)
195
+ @inline eval_start (:: RogersTanimoto , a:: AbstractArray , b:: AbstractArray ) = 0 , 0 , 0 , 0
196
+ @inline function eval_op (:: RogersTanimoto , s1, s2)
200
197
tt = s1 && s2
201
198
tf = s1 && ! s2
202
199
ft = ! s1 && s2
203
200
ff = ! s1 && ! s2
204
201
tt, tf, ft, ff
205
202
end
206
- @compat @ inline function eval_reduce (:: RogersTanimoto , s1, s2)
203
+ @inline function eval_reduce (:: RogersTanimoto , s1, s2)
207
204
a = s1[1 ] + s2[1 ]
208
205
b = s1[2 ] + s2[2 ]
209
206
c = s1[3 ] + s2[3 ]
210
207
d = s1[4 ] + s1[4 ]
211
208
a, b, c, d
212
209
end
213
- @compat @ inline function eval_end (:: RogersTanimoto , a)
210
+ @inline function eval_end (:: RogersTanimoto , a)
214
211
numerator = 2 (a[2 ] + a[3 ])
215
212
denominator = a[1 ] + a[4 ] + 2 (a[2 ] + a[3 ])
216
213
numerator / denominator
0 commit comments