@@ -176,18 +176,22 @@ end
176
176
177
177
# Jaccard
178
178
179
- @inline eval_start (:: Jaccard , a:: AbstractArray , b:: AbstractArray ) = 0 , 0
179
+ @inline eval_start (:: Jaccard , a:: AbstractArray{Bool} , b:: AbstractArray{Bool} ) = 0 , 0
180
+ @inline eval_start {T} (:: Jaccard , a:: AbstractArray{T} , b:: AbstractArray{T} ) = zero (T), zero (T)
180
181
@inline function eval_op (:: Jaccard , s1, s2)
181
- denominator = max (s1, s2)
182
- numerator = min (s1, s2)
183
- numerator, denominator
182
+ abs_m = abs (s1 - s2)
183
+ abs_p = abs (s1 + s2)
184
+ abs_p - abs_m, abs_p + abs_m
184
185
end
185
186
@inline function eval_reduce (:: Jaccard , s1, s2)
186
- a = s1[1 ] + s2[1 ]
187
- b = s1[2 ] + s2[2 ]
187
+ @inbounds a = s1[1 ] + s2[1 ]
188
+ @inbounds b = s1[2 ] + s2[2 ]
188
189
a, b
189
190
end
190
- @inline eval_end (:: Jaccard , a) = 1 - (a[1 ]/ a[2 ])
191
+ @inline function eval_end (:: Jaccard , a)
192
+ @inbounds v = 1 - (a[1 ]/ a[2 ])
193
+ return v
194
+ end
191
195
jaccard (a:: AbstractArray , b:: AbstractArray ) = evaluate (Jaccard (), a, b)
192
196
193
197
# Tanimoto
@@ -201,15 +205,17 @@ jaccard(a::AbstractArray, b::AbstractArray) = evaluate(Jaccard(), a, b)
201
205
tt, tf, ft, ff
202
206
end
203
207
@inline function eval_reduce (:: RogersTanimoto , s1, s2)
204
- a = s1[1 ] + s2[1 ]
205
- b = s1[2 ] + s2[2 ]
206
- c = s1[3 ] + s2[3 ]
207
- d = s1[4 ] + s1[4 ]
208
+ @inbounds begin
209
+ a = s1[1 ] + s2[1 ]
210
+ b = s1[2 ] + s2[2 ]
211
+ c = s1[3 ] + s2[3 ]
212
+ d = s1[4 ] + s1[4 ]
213
+ end
208
214
a, b, c, d
209
215
end
210
216
@inline function eval_end (:: RogersTanimoto , a)
211
- numerator = 2 (a[2 ] + a[3 ])
212
- denominator = a[1 ] + a[4 ] + 2 (a[2 ] + a[3 ])
217
+ @inbounds numerator = 2 (a[2 ] + a[3 ])
218
+ @inbounds denominator = a[1 ] + a[4 ] + 2 (a[2 ] + a[3 ])
213
219
numerator / denominator
214
220
end
215
221
rogerstanimoto {T <: Bool} (a:: AbstractArray{T} , b:: AbstractArray{T} ) = evaluate (RogersTanimoto (), a, b)
@@ -240,13 +246,13 @@ function pairwise!(r::AbstractMatrix, dist::SqEuclidean, a::AbstractMatrix)
240
246
m, n = get_pairwise_dims (r, a)
241
247
At_mul_B! (r, a, a)
242
248
sa2 = sumsq_percol (a)
243
- for j = 1 : n
249
+ @inbounds for j = 1 : n
244
250
for i = 1 : j- 1
245
- @inbounds r[i,j] = r[j,i]
251
+ r[i,j] = r[j,i]
246
252
end
247
- @inbounds r[j,j] = 0
253
+ r[j,j] = 0
248
254
for i = j+ 1 : n
249
- @inbounds r[i,j] = sa2[i] + sa2[j] - 2 * r[i,j]
255
+ r[i,j] = sa2[i] + sa2[j] - 2 * r[i,j]
250
256
end
251
257
end
252
258
r
@@ -258,10 +264,10 @@ function pairwise!(r::AbstractMatrix, dist::Euclidean, a::AbstractMatrix, b::Abs
258
264
At_mul_B! (r, a, b)
259
265
sa2 = sumsq_percol (a)
260
266
sb2 = sumsq_percol (b)
261
- for j = 1 : nb
267
+ @inbounds for j = 1 : nb
262
268
for i = 1 : na
263
- @inbounds v = sa2[i] + sb2[j] - 2 * r[i,j]
264
- @inbounds r[i,j] = isnan (v) ? NaN : sqrt (max (v, 0. ))
269
+ v = sa2[i] + sb2[j] - 2 * r[i,j]
270
+ r[i,j] = isnan (v) ? NaN : sqrt (max (v, 0. ))
265
271
end
266
272
end
267
273
r
@@ -271,14 +277,14 @@ function pairwise!(r::AbstractMatrix, dist::Euclidean, a::AbstractMatrix)
271
277
m, n = get_pairwise_dims (r, a)
272
278
At_mul_B! (r, a, a)
273
279
sa2 = sumsq_percol (a)
274
- for j = 1 : n
280
+ @inbounds for j = 1 : n
275
281
for i = 1 : j- 1
276
- @inbounds r[i,j] = r[j,i]
282
+ r[i,j] = r[j,i]
277
283
end
278
284
@inbounds r[j,j] = 0
279
285
for i = j+ 1 : n
280
- @inbounds v = sa2[i] + sa2[j] - 2 * r[i,j]
281
- @inbounds r[i,j] = isnan (v) ? NaN : sqrt (max (v, 0. ))
286
+ v = sa2[i] + sa2[j] - 2 * r[i,j]
287
+ r[i,j] = isnan (v) ? NaN : sqrt (max (v, 0. ))
282
288
end
283
289
end
284
290
r
@@ -302,13 +308,13 @@ function pairwise!(r::AbstractMatrix, dist::CosineDist, a::AbstractMatrix)
302
308
m, n = get_pairwise_dims (r, a)
303
309
At_mul_B! (r, a, a)
304
310
ra = sqrt! (sumsq_percol (a))
305
- for j = 1 : n
311
+ @inbounds for j = 1 : n
306
312
@simd for i = j+ 1 : n
307
- @inbounds r[i,j] = max (1 - r[i,j] / (ra[i] * ra[j]), 0 )
313
+ r[i,j] = max (1 - r[i,j] / (ra[i] * ra[j]), 0 )
308
314
end
309
- @inbounds r[j,j] = 0
315
+ r[j,j] = 0
310
316
for i = 1 : j- 1
311
- @inbounds r[i,j] = r[j,i]
317
+ r[i,j] = r[j,i]
312
318
end
313
319
end
314
320
r
0 commit comments