Skip to content

Commit 1872573

Browse files
committed
Merge pull request #33 from KristofferC/kc/slices
update to 0.4
2 parents 3dec24c + 8e33e41 commit 1872573

File tree

12 files changed

+202
-183
lines changed

12 files changed

+202
-183
lines changed

.gitignore

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
*.jl.cov
2+
*.jl.*.cov
3+
*.jl.mem
4+
*.ji

.travis.yml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ os:
33
- linux
44
- osx
55
julia:
6-
- 0.3
76
- 0.4
87
- nightly
98
notifications:

README.md

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
[![Build Status](https://travis-ci.org/JuliaStats/Distances.jl.svg?branch=master)](https://travis-ci.org/JuliaStats/Distances.jl)
44
[![Coverage Status](https://coveralls.io/repos/JuliaStats/Distances.jl/badge.svg?branch=master&service=github)](https://coveralls.io/github/JuliaStats/Distances.jl?branch=master)
55

6-
[![Distances](http://pkg.julialang.org/badges/Distances_0.3.svg)](http://pkg.julialang.org/?pkg=Distances&ver=0.3)
76
[![Distances](http://pkg.julialang.org/badges/Distances_0.4.svg)](http://pkg.julialang.org/?pkg=Distances&ver=0.4)
87

98
A Julia package for evaluating distances(metrics) between vectors.

REQUIRE

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1 @@
1-
julia 0.3
2-
ArrayViews 0.4.8-
3-
Compat
1+
julia 0.4

src/Distances.jl

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,7 @@
1-
isdefined(Base, :__precompile__) && __precompile__()
1+
__precompile__()
22

33
module Distances
44

5-
using ArrayViews, Compat
6-
75
export
86
# generic types/functions
97
PreMetric,

src/common.jl

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ function sumsq_percol{T}(a::AbstractMatrix{T})
103103
n = size(a, 2)
104104
r = Array(T, n)
105105
for j = 1:n
106-
aj = view(a,:,j)
106+
aj = slice(a, :, j)
107107
r[j] = dot(aj, aj)
108108
end
109109
return r
@@ -115,7 +115,7 @@ function wsumsq_percol{T1, T2}(w::AbstractArray{T1}, a::AbstractMatrix{T2})
115115
T = typeof(one(T1)*one(T2))
116116
r = Array(T, n)
117117
for j = 1:n
118-
aj = view(a,:,j)
118+
aj = slice(a, :, j)
119119
s = zero(T)
120120
@simd for i = 1:m
121121
@inbounds s += w[i] * abs2(aj[i])
@@ -131,8 +131,8 @@ function dot_percol!(r::AbstractArray, a::AbstractMatrix, b::AbstractMatrix)
131131
size(b) == (m,n) && length(r) == n ||
132132
throw(DimensionMismatch("Inconsistent array dimensions."))
133133
for j = 1:n
134-
aj = view(a,:,j)
135-
bj = view(b,:,j)
134+
aj = slice(a,:,j)
135+
bj = slice(b,:,j)
136136
r[j] = dot(aj, bj)
137137
end
138138
return r

src/generic.jl

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ function colwise!(r::AbstractArray, metric::PreMetric, a::AbstractVector, b::Abs
3333
n = size(b, 2)
3434
length(r) == n || throw(DimensionMismatch("Incorrect size of r."))
3535
for j = 1 : n
36-
@inbounds r[j] = evaluate(metric, a, view(b, :, j))
36+
@inbounds r[j] = evaluate(metric, a, slice(b, :, j))
3737
end
3838
r
3939
end
@@ -42,7 +42,7 @@ function colwise!(r::AbstractArray, metric::PreMetric, a::AbstractMatrix, b::Abs
4242
n = size(a, 2)
4343
length(r) == n || throw(DimensionMismatch("Incorrect size of r."))
4444
for j = 1 : n
45-
@inbounds r[j] = evaluate(metric, view(a, :, j), b)
45+
@inbounds r[j] = evaluate(metric, slice(a, :, j), b)
4646
end
4747
r
4848
end
@@ -51,7 +51,7 @@ function colwise!(r::AbstractArray, metric::PreMetric, a::AbstractMatrix, b::Abs
5151
n = get_common_ncols(a, b)
5252
length(r) == n || throw(DimensionMismatch("Incorrect size of r."))
5353
for j = 1 : n
54-
@inbounds r[j] = evaluate(metric, view(a, :, j), view(b, :, j))
54+
@inbounds r[j] = evaluate(metric, slice(a, :, j), slice(b, :, j))
5555
end
5656
r
5757
end
@@ -86,9 +86,9 @@ function pairwise!(r::AbstractMatrix, metric::PreMetric, a::AbstractMatrix, b::A
8686
nb = size(b, 2)
8787
size(r) == (na, nb) || throw(DimensionMismatch("Incorrect size of r."))
8888
for j = 1 : size(b, 2)
89-
bj = view(b,:,j)
89+
bj = slice(b,:,j)
9090
for i = 1 : size(a, 2)
91-
@inbounds r[i,j] = evaluate(metric, view(a,:,i), bj)
91+
@inbounds r[i,j] = evaluate(metric, slice(a,:,i), bj)
9292
end
9393
end
9494
r
@@ -102,9 +102,9 @@ function pairwise!(r::AbstractMatrix, metric::SemiMetric, a::AbstractMatrix)
102102
n = size(a, 2)
103103
size(r) == (n, n) || throw(DimensionMismatch("Incorrect size of r."))
104104
for j = 1 : n
105-
aj = view(a,:,j)
105+
aj = slice(a,:,j)
106106
for i = j+1 : n
107-
@inbounds r[i,j] = evaluate(metric, view(a,:,i), aj)
107+
@inbounds r[i,j] = evaluate(metric, slice(a,:,i), aj)
108108
end
109109
@inbounds r[j,j] = 0
110110
for i = 1 : j-1

src/metrics.jl

Lines changed: 33 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -28,18 +28,15 @@ type JSDivergence <: SemiMetric end
2828

2929
type SpanNormDist <: SemiMetric end
3030

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}
3233

3334
###########################################################
3435
#
3536
# Define Evaluate
3637
#
3738
###########################################################
3839

39-
if VERSION < v"0.4.0-dev+1624"
40-
eachindex(A::AbstractArray...) = 1:length(A[1])
41-
end
42-
4340
function evaluate(d::UnionMetrics, a::AbstractArray, b::AbstractArray)
4441
if length(a) != length(b)
4542
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
7269
evaluate{T <: Number}(dist::UnionMetrics, a::T, b::T) = eval_end(dist, eval_op(dist, a, b))
7370

7471
# 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
7774

7875
sqeuclidean(a::AbstractArray, b::AbstractArray) = evaluate(SqEuclidean(), a, b)
7976
sqeuclidean{T <: Number}(a::T, b::T) = evaluate(SqEuclidean(), a, b)
8077

8178
# 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
8481
eval_end(::Euclidean, s) = sqrt(s)
8582
euclidean(a::AbstractArray, b::AbstractArray) = evaluate(Euclidean(), a, b)
8683
euclidean(a::Number, b::Number) = evaluate(Euclidean(), a, b)
8784

8885
# 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
9188
cityblock(a::AbstractArray, b::AbstractArray) = evaluate(Cityblock(), a, b)
9289
cityblock{T <: Number}(a::T, b::T) = evaluate(Cityblock(), a, b)
9390

9491
# 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)
9794
# 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])
9996
chebyshev(a::AbstractArray, b::AbstractArray) = evaluate(Chebyshev(), a, b)
10097
chebyshev{T <: Number}(a::T, b::T) = evaluate(Chebyshev(), a, b)
10198

10299
# 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
105102
eval_end(dist::Minkowski, s) = s .^ (1/dist.p)
106103
minkowski(a::AbstractArray, b::AbstractArray, p::Real) = evaluate(Minkowski(p), a, b)
107104
minkowski{T <: Number}(a::T, b::T, p::Real) = evaluate(Minkowski(p), a, b)
108105

109106
# 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
112109
hamming(a::AbstractArray, b::AbstractArray) = evaluate(Hamming(), a, b)
113110
hamming{T <: Number}(a::T, b::T) = evaluate(Hamming(), a, b)
114111

115112
# Cosine dist
116113
function eval_start{T<:AbstractFloat}(::CosineDist, a::AbstractArray{T}, b::AbstractArray{T})
117114
zero(T), zero(T), zero(T)
118115
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)
121118
a1, b1, c1 = s1
122119
a2, b2, c2 = s2
123120
return a1 + a2, b1 + b2, c1 + c2
@@ -135,32 +132,32 @@ corr_dist(a::AbstractArray, b::AbstractArray) = evaluate(CorrDist(), a, b)
135132
result_type(::CorrDist, a::AbstractArray, b::AbstractArray) = result_type(CosineDist(), a, b)
136133

137134
# 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
140137
chisq_dist(a::AbstractArray, b::AbstractArray) = evaluate(ChiSqDist(), a, b)
141138

142139
# 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
145142
kl_divergence(a::AbstractArray, b::AbstractArray) = evaluate(KLDivergence(), a, b)
146143

147144
# JSDivergence
148-
@compat @inline function eval_op{T}(::JSDivergence, ai::T, bi::T)
145+
@inline function eval_op{T}(::JSDivergence, ai::T, bi::T)
149146
u = (ai + bi) / 2
150147
ta = ai > 0 ? ai * log(ai) / 2 : zero(log(one(T)))
151148
tb = bi > 0 ? bi * log(bi) / 2 : zero(log(one(T)))
152149
tu = u > 0 ? u * log(u) : zero(log(one(T)))
153150
ta + tb - tu
154151
end
155-
@compat @inline eval_reduce(::JSDivergence, s1, s2) = s1 + s2
152+
@inline eval_reduce(::JSDivergence, s1, s2) = s1 + s2
156153
js_divergence(a::AbstractArray, b::AbstractArray) = evaluate(JSDivergence(), a, b)
157154

158155
# SpanNormDist
159156
function eval_start(::SpanNormDist, a::AbstractArray, b::AbstractArray)
160157
a[1] - b[1], a[1] - b[1]
161158
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)
164161
min_d, max_d = s1
165162
if s2 > max_d
166163
max_d = s2
@@ -179,38 +176,38 @@ end
179176

180177
# Jaccard
181178

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)
184181
denominator = max(s1, s2)
185182
numerator = min(s1, s2)
186183
numerator, denominator
187184
end
188-
@compat @inline function eval_reduce(::Jaccard, s1, s2)
185+
@inline function eval_reduce(::Jaccard, s1, s2)
189186
a = s1[1] + s2[1]
190187
b = s1[2] + s2[2]
191188
a, b
192189
end
193-
@compat @inline eval_end(::Jaccard, a) = 1 - (a[1]/a[2])
190+
@inline eval_end(::Jaccard, a) = 1 - (a[1]/a[2])
194191
jaccard(a::AbstractArray, b::AbstractArray) = evaluate(Jaccard(), a, b)
195192

196193
# Tanimoto
197194

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)
200197
tt = s1 && s2
201198
tf = s1 && !s2
202199
ft = !s1 && s2
203200
ff = !s1 && !s2
204201
tt, tf, ft, ff
205202
end
206-
@compat @inline function eval_reduce(::RogersTanimoto, s1, s2)
203+
@inline function eval_reduce(::RogersTanimoto, s1, s2)
207204
a = s1[1] + s2[1]
208205
b = s1[2] + s2[2]
209206
c = s1[3] + s2[3]
210207
d = s1[4] + s1[4]
211208
a, b, c, d
212209
end
213-
@compat @inline function eval_end(::RogersTanimoto, a)
210+
@inline function eval_end(::RogersTanimoto, a)
214211
numerator = 2(a[2] + a[3])
215212
denominator = a[1] + a[4] + 2(a[2] + a[3])
216213
numerator / denominator

src/wmetrics.jl

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ immutable WeightedHamming{W <: RealAbstractArray} <: Metric
3131
end
3232

3333

34-
typealias UnionWeightedMetrics{W} @compat(Union{WeightedEuclidean{W}, WeightedSqEuclidean{W}, WeightedCityblock{W}, WeightedMinkowski{W}, WeightedHamming{W}})
34+
typealias UnionWeightedMetrics{W} Union{WeightedEuclidean{W}, WeightedSqEuclidean{W}, WeightedCityblock{W}, WeightedMinkowski{W}, WeightedHamming{W}}
3535
Base.eltype(x::UnionWeightedMetrics) = eltype(x.weights)
3636
###########################################################
3737
#
@@ -82,30 +82,30 @@ function evaluate(d::UnionWeightedMetrics, a::AbstractArray, b::AbstractArray)
8282
end
8383

8484
# Squared Euclidean
85-
@compat @inline eval_op(::WeightedSqEuclidean, ai, bi, wi) = abs2(ai - bi) * wi
86-
@compat @inline eval_reduce(::WeightedSqEuclidean, s1, s2) = s1 + s2
85+
@inline eval_op(::WeightedSqEuclidean, ai, bi, wi) = abs2(ai - bi) * wi
86+
@inline eval_reduce(::WeightedSqEuclidean, s1, s2) = s1 + s2
8787
wsqeuclidean(a::AbstractArray, b::AbstractArray, w::AbstractArray) = evaluate(WeightedSqEuclidean(w), a, b)
8888

8989
# Weighted Euclidean
90-
@compat @inline eval_op(::WeightedEuclidean, ai, bi, wi) = abs2(ai - bi) * wi
91-
@compat @inline eval_reduce(::WeightedEuclidean, s1, s2) = s1 + s2
92-
@compat @inline eval_end(::WeightedEuclidean, s) = sqrt(s)
90+
@inline eval_op(::WeightedEuclidean, ai, bi, wi) = abs2(ai - bi) * wi
91+
@inline eval_reduce(::WeightedEuclidean, s1, s2) = s1 + s2
92+
@inline eval_end(::WeightedEuclidean, s) = sqrt(s)
9393
weuclidean(a::AbstractArray, b::AbstractArray, w::AbstractArray) = evaluate(WeightedEuclidean(w), a, b)
9494

9595
# City Block
96-
@compat @inline eval_op(::WeightedCityblock, ai, bi, wi) = abs((ai - bi) * wi)
97-
@compat @inline eval_reduce(::WeightedCityblock, s1, s2) = s1 + s2
96+
@inline eval_op(::WeightedCityblock, ai, bi, wi) = abs((ai - bi) * wi)
97+
@inline eval_reduce(::WeightedCityblock, s1, s2) = s1 + s2
9898
wcityblock(a::AbstractArray, b::AbstractArray, w::AbstractArray) = evaluate(WeightedCityblock(w), a, b)
9999

100100
# Minkowski
101-
@compat @inline eval_op(dist::WeightedMinkowski, ai, bi, wi) = abs(ai - bi) .^ dist.p * wi
102-
@compat @inline eval_reduce(::WeightedMinkowski, s1, s2) = s1 + s2
101+
@inline eval_op(dist::WeightedMinkowski, ai, bi, wi) = abs(ai - bi) .^ dist.p * wi
102+
@inline eval_reduce(::WeightedMinkowski, s1, s2) = s1 + s2
103103
eval_end(dist::WeightedMinkowski, s) = s .^ (1/dist.p)
104104
wminkowski(a::AbstractArray, b::AbstractArray, w::AbstractArray, p::Real) = evaluate(WeightedMinkowski(w, p), a, b)
105105

106106
# WeightedHamming
107-
@compat @inline eval_op(::WeightedHamming, ai, bi, wi) = ai != bi ? wi : zero(eltype(wi))
108-
@compat @inline eval_reduce(::WeightedHamming, s1, s2) = s1 + s2
107+
@inline eval_op(::WeightedHamming, ai, bi, wi) = ai != bi ? wi : zero(eltype(wi))
108+
@inline eval_reduce(::WeightedHamming, s1, s2) = s1 + s2
109109
whamming(a::AbstractArray, b::AbstractArray, w::AbstractArray) = evaluate(WeightedHamming(w), a, b)
110110

111111
###########################################################

test/REQUIRE

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
BaseTestNext

0 commit comments

Comments
 (0)