@@ -252,22 +252,21 @@ end
252
252
end
253
253
return eval_end (d, s)
254
254
end
255
- result_type (dist:: UnionMetrics , :: AbstractArray{T1} , :: AbstractArray{T2} ) where {T1, T2} =
256
- typeof (eval_end (dist, parameters (dist) === nothing ?
257
- eval_op (dist, one (T1), one (T2)) :
258
- eval_op (dist, one (T1), one (T2), one (eltype (dist)))))
255
+ result_type (dist:: UnionMetrics , a:: AbstractArray , b:: AbstractArray ) =
256
+ typeof (evaluate (dist, oneunit (eltype (a)), oneunit (eltype (b))))
257
+
259
258
eval_start (d:: UnionMetrics , a:: AbstractArray , b:: AbstractArray ) =
260
259
zero (result_type (d, a, b))
261
260
eval_end (d:: UnionMetrics , s) = s
262
261
263
- evaluate (dist:: UnionMetrics , a:: T , b:: T ) where {T <: Number } = eval_end (dist, eval_op (dist, a, b))
262
+ evaluate (dist:: UnionMetrics , a:: Number , b:: Number ) = eval_end (dist, eval_op (dist, a, b))
264
263
265
264
# SqEuclidean
266
265
@inline eval_op (:: SqEuclidean , ai, bi) = abs2 (ai - bi)
267
266
@inline eval_reduce (:: SqEuclidean , s1, s2) = s1 + s2
268
267
269
268
sqeuclidean (a:: AbstractArray , b:: AbstractArray ) = evaluate (SqEuclidean (), a, b)
270
- sqeuclidean (a:: T , b:: T ) where {T <: Number } = evaluate (SqEuclidean (), a, b)
269
+ sqeuclidean (a:: Number , b:: Number ) = evaluate (SqEuclidean (), a, b)
271
270
272
271
# Euclidean
273
272
@inline eval_op (:: Euclidean , ai, bi) = abs2 (ai - bi)
@@ -285,13 +284,13 @@ Base.eltype(d::PeriodicEuclidean) = eltype(d.periods)
285
284
s3 = min (s2, p - s2)
286
285
abs2 (s3)
287
286
end
287
+ @inline function eval_op (d:: PeriodicEuclidean , ai, bi)
288
+ periods = d. periods
289
+ p = isempty (periods) ? oneunit (eltype (periods)) : first (periods)
290
+ eval_op (d, ai, bi, p)
291
+ end
288
292
@inline eval_reduce (:: PeriodicEuclidean , s1, s2) = s1 + s2
289
293
@inline eval_end (:: PeriodicEuclidean , s) = sqrt (s)
290
- function evaluate (dist:: PeriodicEuclidean , a:: T , b:: T ) where {T <: Real }
291
- p = first (dist. periods)
292
- d = mod (abs (a - b), p)
293
- min (d, p - d)
294
- end
295
294
peuclidean (a:: AbstractArray , b:: AbstractArray , p:: AbstractArray{<: Real} ) =
296
295
evaluate (PeriodicEuclidean (p), a, b)
297
296
peuclidean (a:: Number , b:: Number , p:: Real ) = evaluate (PeriodicEuclidean ([p]), a, b)
@@ -300,38 +299,39 @@ peuclidean(a::Number, b::Number, p::Real) = evaluate(PeriodicEuclidean([p]), a,
300
299
@inline eval_op (:: Cityblock , ai, bi) = abs (ai - bi)
301
300
@inline eval_reduce (:: Cityblock , s1, s2) = s1 + s2
302
301
cityblock (a:: AbstractArray , b:: AbstractArray ) = evaluate (Cityblock (), a, b)
303
- cityblock (a:: T , b:: T ) where {T <: Number } = evaluate (Cityblock (), a, b)
302
+ cityblock (a:: Number , b:: Number ) = evaluate (Cityblock (), a, b)
304
303
305
304
# Total variation
306
305
@inline eval_op (:: TotalVariation , ai, bi) = abs (ai - bi)
307
306
@inline eval_reduce (:: TotalVariation , s1, s2) = s1 + s2
308
307
eval_end (:: TotalVariation , s) = s / 2
309
308
totalvariation (a:: AbstractArray , b:: AbstractArray ) = evaluate (TotalVariation (), a, b)
310
- totalvariation (a:: T , b:: T ) where {T <: Number } = evaluate (TotalVariation (), a, b)
309
+ totalvariation (a:: Number , b:: Number ) = evaluate (TotalVariation (), a, b)
311
310
312
311
# Chebyshev
313
312
@inline eval_op (:: Chebyshev , ai, bi) = abs (ai - bi)
314
313
@inline eval_reduce (:: Chebyshev , s1, s2) = max (s1, s2)
315
314
# if only NaN, will output NaN
316
315
@inline Base. @propagate_inbounds eval_start (:: Chebyshev , a:: AbstractArray , b:: AbstractArray ) = abs (a[1 ] - b[1 ])
317
316
chebyshev (a:: AbstractArray , b:: AbstractArray ) = evaluate (Chebyshev (), a, b)
318
- chebyshev (a:: T , b:: T ) where {T <: Number } = evaluate (Chebyshev (), a, b)
317
+ chebyshev (a:: Number , b:: Number ) = evaluate (Chebyshev (), a, b)
319
318
320
319
# Minkowski
321
320
@inline eval_op (dist:: Minkowski , ai, bi) = abs (ai - bi).^ dist. p
322
321
@inline eval_reduce (:: Minkowski , s1, s2) = s1 + s2
323
322
eval_end (dist:: Minkowski , s) = s.^ (1 / dist. p)
324
323
minkowski (a:: AbstractArray , b:: AbstractArray , p:: Real ) = evaluate (Minkowski (p), a, b)
325
- minkowski (a:: T , b:: T , p:: Real ) where {T <: Number } = evaluate (Minkowski (p), a, b)
324
+ minkowski (a:: Number , b:: Number , p:: Real ) = evaluate (Minkowski (p), a, b)
326
325
327
326
# Hamming
328
327
@inline eval_op (:: Hamming , ai, bi) = ai != bi ? 1 : 0
329
328
@inline eval_reduce (:: Hamming , s1, s2) = s1 + s2
330
329
hamming (a:: AbstractArray , b:: AbstractArray ) = evaluate (Hamming (), a, b)
331
- hamming (a:: T , b:: T ) where {T <: Number } = evaluate (Hamming (), a, b)
330
+ hamming (a:: Number , b:: Number ) = evaluate (Hamming (), a, b)
332
331
333
332
# Cosine dist
334
- @inline function eval_start (:: CosineDist , a:: AbstractArray{T} , b:: AbstractArray{T} ) where {T <: Real }
333
+ @inline function eval_start (dist:: CosineDist , a:: AbstractArray , b:: AbstractArray )
334
+ T = Base. promote_typeof (eval_op (dist, oneunit (eltype (a)), oneunit (eltype (b)))... )
335
335
zero (T), zero (T), zero (T)
336
336
end
337
337
@inline eval_op (:: CosineDist , ai, bi) = ai * bi, ai * ai, bi * bi
@@ -360,12 +360,14 @@ result_type(::CorrDist, a::AbstractArray, b::AbstractArray) = result_type(Cosine
360
360
chisq_dist (a:: AbstractArray , b:: AbstractArray ) = evaluate (ChiSqDist (), a, b)
361
361
362
362
# KLDivergence
363
- @inline eval_op (:: KLDivergence , ai, bi) = ai > 0 ? ai * log (ai / bi) : zero (ai)
363
+ @inline eval_op (dist:: KLDivergence , ai, bi) =
364
+ ai > 0 ? ai * log (ai / bi) : zero (eval_op (dist, oneunit (ai), bi))
364
365
@inline eval_reduce (:: KLDivergence , s1, s2) = s1 + s2
365
366
kl_divergence (a:: AbstractArray , b:: AbstractArray ) = evaluate (KLDivergence (), a, b)
366
367
367
368
# GenKLDivergence
368
- @inline eval_op (:: GenKLDivergence , ai, bi) = ai > 0 ? ai * log (ai / bi) - ai + bi : bi
369
+ @inline eval_op (dist:: GenKLDivergence , ai, bi) =
370
+ ai > 0 ? ai * log (ai / bi) - ai + bi : oftype (eval_op (dist, oneunit (ai), bi), bi)
369
371
@inline eval_reduce (:: GenKLDivergence , s1, s2) = s1 + s2
370
372
gkl_divergence (a:: AbstractArray , b:: AbstractArray ) = evaluate (GenKLDivergence (), a, b)
371
373
@@ -450,15 +452,17 @@ end
450
452
451
453
eval_end (:: SpanNormDist , s) = s[2 ] - s[1 ]
452
454
spannorm_dist (a:: AbstractArray , b:: AbstractArray ) = evaluate (SpanNormDist (), a, b)
453
- function result_type (dist:: SpanNormDist , :: AbstractArray{T1} , :: AbstractArray{T2} ) where {T1, T2}
454
- typeof (eval_op (dist, one (T1), one (T2)))
455
- end
455
+ result_type (dist:: SpanNormDist , a:: AbstractArray , b:: AbstractArray ) =
456
+ typeof (eval_op (dist, oneunit (eltype (a)), oneunit (eltype (b))))
456
457
457
458
458
459
# Jaccard
459
460
460
461
@inline eval_start (:: Jaccard , a:: AbstractArray{Bool} , b:: AbstractArray{Bool} ) = 0 , 0
461
- @inline eval_start (:: Jaccard , a:: AbstractArray{T} , b:: AbstractArray{T} ) where {T} = zero (T), zero (T)
462
+ @inline function eval_start (dist:: Jaccard , a:: AbstractArray , b:: AbstractArray )
463
+ T = Base. promote_typeof (eval_op (dist, oneunit (eltype (a)), oneunit (eltype (b)))... )
464
+ zero (T), zero (T)
465
+ end
462
466
@inline function eval_op (:: Jaccard , s1, s2)
463
467
abs_m = abs (s1 - s2)
464
468
abs_p = abs (s1 + s2)
@@ -478,7 +482,10 @@ jaccard(a::AbstractArray, b::AbstractArray) = evaluate(Jaccard(), a, b)
478
482
# BrayCurtis
479
483
480
484
@inline eval_start (:: BrayCurtis , a:: AbstractArray{Bool} , b:: AbstractArray{Bool} ) = 0 , 0
481
- @inline eval_start (:: BrayCurtis , a:: AbstractArray{T} , b:: AbstractArray{T} ) where {T} = zero (T), zero (T)
485
+ @inline function eval_start (dist:: BrayCurtis , a:: AbstractArray , b:: AbstractArray )
486
+ T = Base. promote_typeof (eval_op (dist, oneunit (eltype (a)), oneunit (eltype (b)))... )
487
+ zero (T), zero (T)
488
+ end
482
489
@inline function eval_op (:: BrayCurtis , s1, s2)
483
490
abs_m = abs (s1 - s2)
484
491
abs_p = abs (s1 + s2)
0 commit comments