@@ -39,15 +39,19 @@ mutable struct DDM{T <: Real} <: AbstractDDM
3939 α:: T
4040 z:: T
4141 τ:: T
42+ function DDM (ν:: T , α:: T , z:: T , τ:: T ) where {T <: Real }
43+ @argcheck α ≥ 0
44+ @argcheck (z ≥ 0 ) && (z ≤ 1 )
45+ @argcheck τ ≥ 0
46+ return new {T} (ν, α, z, τ)
47+ end
4248end
4349
4450function DDM (ν, α, z, τ)
4551 return DDM (promote (ν, α, z, τ)... )
4652end
4753
48- function params (d:: DDM )
49- return (d. ν, d. α, d. z, d. τ)
50- end
54+ params (d:: DDM ) = (d. ν, d. α, d. z, d. τ)
5155
5256function DDM (; ν = 1.00 , α = 0.80 , τ = 0.30 , z = 0.50 )
5357 return DDM (ν, α, z, τ)
6468# Wabersich & Vandekerckhove (2014) #
6569# ####################################
6670
67- function pdf (d:: DDM , choice, rt; ϵ:: Real = 1.0e-12 )
71+ function pdf (d:: DDM{T} , choice, rt; ϵ:: Real = 1.0e-12 ) where {T <: Real }
72+ @argcheck d. τ < rt
6873 if choice == 1
6974 (ν, α, z, τ) = params (d)
7075 return _pdf (DDM (- ν, α, 1 - z, τ), rt; ϵ)
@@ -73,11 +78,8 @@ function pdf(d::DDM, choice, rt; ϵ::Real = 1.0e-12)
7378end
7479
7580# probability density function over the lower boundary
76- function _pdf (d:: DDM{T} , t:: Real ; ϵ:: Real = 1.0e-12 ) where {T <: Real }
81+ function _pdf (d:: DDM , t:: Real ; ϵ:: Real = 1.0e-12 )
7782 (ν, α, z, τ) = params (d)
78- if τ ≥ t
79- return T (NaN )
80- end
8183 u = (t - τ) / α^ 2 # use normalized time
8284
8385 K_s = 2.0
@@ -97,7 +99,6 @@ function _pdf(d::DDM{T}, t::Real; ϵ::Real = 1.0e-12) where {T <: Real}
9799 if K_s < K_l
98100 return p * _small_time_pdf (u, z, ceil (Int, K_s))
99101 end
100-
101102 return p * _large_time_pdf (u, z, ceil (Int, K_l))
102103end
103104
@@ -106,7 +107,7 @@ function _small_time_pdf(u::T, z::T, K::Int) where {T <: Real}
106107 inf_sum = zero (T)
107108
108109 k_series = (- floor (Int, 0.5 * (K - 1 ))): ceil (Int, 0.5 * (K - 1 ))
109- for k in k_series
110+ for k ∈ k_series
110111 inf_sum += ((2 k + z) * exp (- ((2 k + z)^ 2 / (2 u))))
111112 end
112113
@@ -117,15 +118,14 @@ end
117118function _large_time_pdf (u:: T , z:: T , K:: Int ) where {T <: Real }
118119 inf_sum = zero (T)
119120
120- for k = 1 : K
121+ for k ∈ 1 : K
121122 inf_sum += (k * exp (- 0.5 * (k^ 2 * π^ 2 * u)) * sin (k * π * z))
122123 end
123124
124125 return π * inf_sum
125126end
126127
127128logpdf (d:: DDM , choice, rt; ϵ:: Real = 1.0e-12 ) = log (pdf (d, choice, rt; ϵ))
128- # logpdf(d::DDM, t::Real; ϵ::Real = 1.0e-12) = log(pdf(d, t; ϵ))
129129
130130logpdf (d:: DDM , data:: Tuple ) = logpdf (d, data... )
131131
@@ -134,7 +134,8 @@ logpdf(d::DDM, data::Tuple) = logpdf(d, data...)
134134# Blurton, Kesselmeier, & Gondan (2012) #
135135# ########################################
136136
137- function cdf (d:: DDM , choice:: Int , rt:: Real = 10 ; ϵ:: Real = 1.0e-12 )
137+ function cdf (d:: DDM{T} , choice:: Int , rt:: Real = 10 ; ϵ:: Real = 1.0e-12 ) where {T <: Real }
138+ @argcheck d. τ < rt
138139 if choice == 1
139140 (ν, α, z, τ) = params (d)
140141 return _cdf (DDM (- ν, α, 1 - z, τ), rt; ϵ)
@@ -144,11 +145,7 @@ function cdf(d::DDM, choice::Int, rt::Real = 10; ϵ::Real = 1.0e-12)
144145end
145146
146147# cumulative density function over the lower boundary
147- function _cdf (d:: DDM{T} , t:: Real ; ϵ:: Real = 1.0e-12 ) where {T <: Real }
148- if d. τ ≥ t
149- return T (NaN )
150- end
151-
148+ function _cdf (d:: DDM , t:: Real ; ϵ:: Real = 1.0e-12 )
152149 K_l = _K_large (d, t; ϵ)
153150 K_s = _K_small (d, t; ϵ)
154151
@@ -163,7 +160,7 @@ function _Fl_lower(d::DDM{T}, K::Int, t::Real) where {T <: Real}
163160 (ν, α, z, τ) = params (d)
164161 F = zero (T)
165162 K_series = K: - 1 : 1
166- for k in K_series
163+ for k ∈ K_series
167164 F -= (
168165 k / (ν^ 2 + k^ 2 * π^ 2 / (α^ 2 )) *
169166 exp (- ν * α * z - 0.5 * ν^ 2 * (t - τ) - 0.5 * k^ 2 * π^ 2 / (α^ 2 ) * (t - τ)) *
@@ -186,7 +183,7 @@ function _Fs_lower(d::DDM{T}, K::Int, t::Real) where {T <: Real}
186183 S2 = zero (T)
187184 K_series = K: - 1 : 1
188185
189- for k in K_series
186+ for k ∈ K_series
190187 S1 += (
191188 _exp_pnorm (2 * ν * α * k, - sign (ν) * (2 * α * k + α * z + ν * (t - τ)) / sqt) - _exp_pnorm (
192189 - 2 * ν * α * k - 2 * ν * α * z,
@@ -214,11 +211,10 @@ function _Fs_lower(d::DDM{T}, K::Int, t::Real) where {T <: Real}
214211end
215212
216213# Zero drift version
217- function _Fs0_lower (d :: DDM{T} , K:: Int , t:: Real ) where {T <: Real }
218- (_, α, z, τ) = params (d)
214+ function _Fs0_lower (dist :: DDM{T} , K:: Int , t:: Real ) where {T <: Real }
215+ (; α, z, τ) = dist
219216 F = zero (T)
220- K_series = K: - 1 : 0
221- for k in K_series
217+ for k ∈ K: - 1 : 0
222218 F -= (
223219 cdf (Distributions. Normal (), (- 2 * k - 2 + z) * α / sqrt (t - τ)) +
224220 cdf (Distributions. Normal (), (- 2 * k - z) * α / sqrt (t - τ))
0 commit comments