Skip to content

Commit ced6a59

Browse files
committed
MC changes for estimation
1 parent 1c2ec96 commit ced6a59

File tree

3 files changed

+37
-4
lines changed

3 files changed

+37
-4
lines changed

src/abstractmodel.jl

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,34 @@ function (<=)(m::AbstractModel{T}, p::AbstractParameter{T}) where T
102102
end
103103

104104

105+
106+
"""
107+
```
108+
(<=)(m::AbstractModel{T}, p::AbstractParameter{T}) where T
109+
```
110+
111+
Syntax for adding a parameter to a model: m <= parameter.
112+
NOTE: If `p` is added to `m` and length(m.steady_state) > 0, `keys(m)` will not generate the
113+
index of `p` in `get_parameters(m)`.
114+
"""
115+
function (<=)(m::AbstractModel{T}, p::AbstractVectorParameter{V,T}) where {V,T}
116+
117+
if !in(p.key, keys(m.keys))
118+
119+
new_param_index = length(m.keys) + 1
120+
121+
# grow parameters and add the parameter
122+
push!(get_parameters(m), p)
123+
124+
# add parameter location to dict
125+
setindex!(m.keys, new_param_index, p.key)
126+
else
127+
# overwrite the previous parameter with the new one
128+
setindex!(m, p, p.key)
129+
end
130+
end
131+
132+
105133
"""
106134
```
107135
(<=)(m::AbstractModel{T}, p::AbstractVectorParameter{T}) where T

src/parameters.jl

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -497,7 +497,6 @@ function parameter_ad(key::Symbol,
497497

498498
# If fixed=true, force bounds to match and leave prior as null. We need to define new
499499
# variable names here because of lexical scoping.
500-
501500
valuebounds_new = valuebounds
502501
transform_parameterization_new = transform_parameterization
503502
transform_new = transform
@@ -595,7 +594,7 @@ function parameter(p::UnscaledParameter{T,U}, newvalue::T) where {T <: Number, U
595594
end
596595

597596
function parameter_ad(p::UnscaledParameterAD{S,T,U}, newvalue::Snew;
598-
change_value_type::Bool = false) where {S<:Real, Snew<:Real, T <: Number, U <: Transform}
597+
change_value_type::Bool = false) where {S<:Real, Snew<:Real, T <: Number, U <: Transform}
599598
p.fixed && return p # if the parameter is fixed, don't change its value
600599
if !change_value_type && (typeof(p.value) != typeof(newvalue))
601600
error("Type of newvalue $(newvalue) does not match the type of the current value for parameter $(string(p.key)). Set keyword change_value_type = true if you want to overwrite the type of the parameter value.")
@@ -1173,8 +1172,10 @@ function update!(pvec::ParameterVector, values::AbstractVector{T};
11731172
map!(tmp, pvec, pvec, values)
11741173
else
11751174
if typeof(pvec[1]) <: ParameterAD
1175+
11761176
map!(parameter_ad, pvec, pvec, values[1:length(pvec)])
11771177
else
1178+
11781179
map!(parameter, pvec, pvec, values[1:length(pvec)])
11791180
end
11801181
# It is assumed that, if regime-switching, the regimes are toggled to regime 1 before calling update!
@@ -1190,10 +1191,12 @@ function update!(pvec::ParameterVector, values::AbstractVector{T};
11901191
if haskey(para.regimes, :value)
11911192
for key in keys(para.regimes[:value])
11921193
if key == 1
1194+
11931195
set_regime_val!(para, key, para.value)
11941196
else
11951197
# Note that set_regime_val! handles what to do if para is fixed, enforce valuebounds, etc.
11961198
i += 1
1199+
11971200
set_regime_val!(para, key, values[i])
11981201
end
11991202
end

src/regimes.jl

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ function set_regime_val!(p::Parameter{S},
2525
p.regimes[:value] = OrderedDict{Int,S}()
2626
end
2727

28+
2829
# First check if fixed and enforce valuebounds so
2930
# `set_regime_val!` mirrors `parameter(p::Parameter, newvalue::S)` functionality
3031
if haskey(p.regimes, :fixed) && haskey(p.regimes[:fixed], i) ? regime_fixed(p, i) : false
@@ -41,7 +42,7 @@ function set_regime_val!(p::Parameter{S},
4142
p.regimes[:value][i] = v
4243
elseif (p.valuebounds[1] <= v <= p.valuebounds[2]) || override_bounds
4344
p.regimes[:value][i] = v
44-
elseif p.fixed
45+
elseif p.fixed && regime_fixed(p,i)
4546
# When parameters are initialized as non-regime-switching and fixed,
4647
# the valuebounds is automatically set to (p.value, p.value).
4748
# Unless valuebounds are set to regime-switching, it is not possible
@@ -52,6 +53,7 @@ function set_regime_val!(p::Parameter{S},
5253
"keyword `override_bounds` is set to `true`."))
5354
else
5455
throw(ParamBoundsError("New value of $(string(p.key)) ($(v)) is out of bounds ($(p.valuebounds))"))
56+
5557
end
5658
return v
5759
end
@@ -324,7 +326,7 @@ function toggle_regime!(p::Parameter{S}, i::Int) where S <: Real
324326
p.fixed = p.regimes[field][i]
325327
end
326328
elseif haskey(p.regimes, field) && !haskey(p.regimes[field], i)
327-
error("Regime $i for field $field not found")
329+
error("Regime $i for field $field not found for parameter $(p.key)")
328330
end
329331
end
330332
end

0 commit comments

Comments
 (0)