-
Notifications
You must be signed in to change notification settings - Fork 52
/
utils.jl
99 lines (77 loc) · 2.67 KB
/
utils.jl
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
#################### Model Expression Operators ####################
function modelfx(literalargs::Vector{Tuple{Symbol, DataType}}, f::Function)
modelfxsrc(literalargs, f)[1]
end
function modelfxsrc(literalargs::Vector{Tuple{Symbol, DataType}}, f::Function)
args = Expr(:tuple, map(arg -> Expr(:(::), arg[1], arg[2]), literalargs)...)
expr, src = modelexprsrc(f, literalargs)
fx = Core.eval(Main, Expr(:function, args, expr))
(fx, src)
end
function modelexprsrc(f::Function, literalargs::Vector{Tuple{Symbol, DataType}})
m = first(methods(f).ms)
argnames = Base.method_argnames(m)
fkeys = Symbol[argnames[2:end]...]
ftypes = DataType[m.sig.parameters[2:end]...]
n = length(fkeys)
literalinds = Int[]
for (key, T) in literalargs
i = findfirst(fkey -> fkey == key, fkeys)
if i != nothing && ftypes[i] == T
push!(literalinds, i)
end
end
nodeinds = setdiff(1:n, literalinds)
all(T -> T == Any, ftypes[nodeinds]) ||
throw(ArgumentError("model node arguments are not all of type Any"))
modelargs = Array{Any}(undef, n)
for i in nodeinds
modelargs[i] = Expr(:ref, :model, QuoteNode(fkeys[i]))
end
for i in literalinds
modelargs[i] = fkeys[i]
end
expr = Expr(:block, Expr(:(=), :f, f), Expr(:call, :f, modelargs...))
(expr, fkeys[nodeinds])
end
#################### Mathematical Operators ####################
isprobvec(p::AbstractVector) = isprobvec(convert(Vector{Float64}, p))
cummean(x::AbstractArray) = mapslices(cummean, x, dims=1)
function cummean(x::AbstractVector{T}) where {T<:Real}
y = similar(x, Float64)
xs = 0.0
for i in 1:length(x)
xs += x[i]
y[i] = xs / i
end
y
end
dot(x) = dot(x, x)
logit(x::Real) = log(x / (1.0 - x))
invlogit(x::Real) = 1.0 / (exp(-x) + 1.0)
## Csorgo S and Faraway JJ. The exact and asymptotic distributions of the
## Cramer-von Mises statistic. Journal of the Royal Statistical Society,
## Series B, 58: 221-234, 1996.
function pcramer(q::Real)
p = 0.0
for k in 0:3
c1 = 4.0 * k + 1.0
c2 = c1^2 / (16.0 * q)
p += gamma(k + 0.5) / factorial(k) * sqrt(c1) * exp(-c2) * besselk(0.25, c2)
end
p / (pi^1.5 * sqrt(q))
end
#################### Auxiliary Functions ####################
## pmap2 is a partial work-around for the pmap issue in julia 0.4.0 of worker
## node errors being blocked. In single-processor mode, pmap2 calls map
## instead to avoid the error handling issue. In multi-processor mode, pmap is
## called and will apply its error processing.
function pmap2(f::Function, lsts::AbstractArray)
if (nprocs() > 1)
pmap(f, lsts)
else
map(f, lsts)
end
end
ind2sub(dims, ind) = Tuple(CartesianIndices(dims)[ind])
showall(v) = showall(stdout, v)