Commit ceb7ee5b authored by MichelJuillard's avatar MichelJuillard

fixed deprecation messages for Julia v1.0.0

parent c0e86143
module Dynare
using LinearAlgebra
using NLsolve
using Suppressor
using Printf
export @var, @varexo, @parameters, @model, @modfile
const MathExpr = Union{Expr,Symbol,Number}
type Model
mutable struct Model
endo::Vector{Symbol}
exo::Vector{Symbol}
param::Vector{Symbol}
......@@ -40,14 +41,14 @@ type Model
dynamic_mg!::Function # Dynamic model Jacobian (yy,x,p,jacobian)
end
Model() = Model(Array{Symbol}(0), Array{Symbol}(0), Array{Symbol}(0), Array{MathExpr}(0),
Model() = Model(Array{Symbol}(undef, 0), Array{Symbol}(undef, 0), Array{Symbol}(undef, 0), Array{MathExpr}(undef, 0),
0, 0, 0,
Array{Int}(0), Array{Int}(0),
Array{Int}(0), Array{Int}(0),
Array{Int}(0), Array{Int}(0),
Array{Int}(0),
Array{Int}(0), Array{Int}(0),
Array{Int}(0), Array{Int}(0),
Array{Int}(undef, 0), Array{Int}(undef, 0),
Array{Int}(undef, 0), Array{Int}(undef, 0),
Array{Int}(undef, 0), Array{Int}(undef, 0),
Array{Int}(undef, 0),
Array{Int}(undef, 0), Array{Int}(undef, 0),
Array{Int}(undef, 0), Array{Int}(undef, 0),
0, 0, 0, 0, 0, 0, 0,
(y::Vector{Float64}, x::Vector{Float64}, p::Vector{Float64}, fvec::Vector{Float64}) -> nothing,
(y::Vector{Float64}, x::Vector{Float64}, p::Vector{Float64}, fjac::Matrix{Float64}) -> nothing,
......@@ -71,10 +72,13 @@ end
remove_line_blocks(e::Any) = e
function remove_line_blocks(e::Expr)
if e.head == :block
assert(sum(map(y->(typeof(y) == Symbol || y.head != :line), e.args)) == 1)
if typeof(e) == LineNumberNode
return
elseif e.head == :block
# assert(sum(map(y->(typeof(y) == Symbol || y.head != :line), e.args)) == 1)
for x in e.args
if typeof(x) == Symbol || x.head != :line
# if typeof(x) == Symbol || x.head != :line
if typeof(x) != LineNumberNode
return x
end
end
......@@ -99,7 +103,7 @@ scan_expr(e::Number, endo::Vector{Symbol}, lead_lags::Dict{Symbol,Tuple{Int,Int}
scan_expr(e::Symbol, endo::Vector{Symbol}, lead_lags::Dict{Symbol,Tuple{Int,Int}}) = nothing
function scan_expr(e::Expr, endo::Vector{Symbol}, lag_lead::Dict{Symbol,Tuple{Int,Int}})
if e.head == :call
if typeof(e) != LineNumberNode && e.head == :call
if !isempty(filter(x->x==e.args[1], endo))
v = e.args[1]
shift = e.args[2]
......@@ -175,8 +179,8 @@ import Calculus.differentiate
include("symbolic.jl")
function compute_static_mf(m::Model)
reqs = Array{MathExpr}(m.n_endo)
jacob = Array{MathExpr}(m.n_endo, m.n_endo)
reqs = Array{MathExpr}(undef, m.n_endo)
jacob = Array{MathExpr}(undef, m.n_endo, m.n_endo)
# Compute expressions for static residuals and jacobian
for i = 1:m.n_endo
......@@ -205,8 +209,8 @@ function compute_static_mf(m::Model)
end
# Construct static model functions
f_assigns = Array{Expr}(0)
g_assigns = Array{Expr}(0)
f_assigns = Array{Expr}(undef, 0)
g_assigns = Array{Expr}(undef, 0)
for i = 1:m.n_endo
push!(f_assigns, :(fvec[$i] = $(reqs[i])))
for j = 1:m.n_endo
......@@ -215,13 +219,13 @@ function compute_static_mf(m::Model)
end
@eval begin
@suppress function static_mf!(y::Vector{Float64}, x::Vector{Float64}, p::Vector{Float64}, fvec::Vector{Float64})
function static_mf!(y::Vector{Float64}, x::Vector{Float64}, p::Vector{Float64}, fvec::Vector{Float64})
$(f_assigns...)
end
end
@eval begin
@suppress function static_mg!(y::Vector{Float64}, x::Vector{Float64}, p::Vector{Float64}, fjac::Matrix{Float64})
function static_mg!(y::Vector{Float64}, x::Vector{Float64}, p::Vector{Float64}, fjac::Matrix{Float64})
$(g_assigns...)
end
end
......@@ -233,17 +237,17 @@ end
function compute_dynamic_mf(m::Model)
ndyn = m.n_back_mixed + m.n_endo + m.n_fwrd_mixed
njcols = ndyn + m.n_exo
reqs = Array{MathExpr}(m.n_endo)
jacob = Array{MathExpr}(m.n_endo, njcols)
reqs = Array{MathExpr}(undef, m.n_endo)
jacob = Array{MathExpr}(undef, m.n_endo, njcols)
# Create gensyms for lagged and leaded variables
lag_gensyms = Array{Symbol}(m.n_back_mixed)
lag_gensyms = Array{Symbol}(undef, m.n_back_mixed)
lag_dict = Dict{Symbol,Symbol}()
for i = 1:m.n_back_mixed
lag_gensyms[i] = gensym()
lag_dict[m.endo[m.zeta_back_mixed[i]]] = lag_gensyms[i]
end
lead_gensyms = Array{Symbol}(m.n_fwrd_mixed)
lead_gensyms = Array{Symbol}(undef, m.n_fwrd_mixed)
lead_dict = Dict{Symbol,Symbol}()
for i = 1:m.n_fwrd_mixed
lead_gensyms[i] = gensym()
......@@ -282,8 +286,8 @@ function compute_dynamic_mf(m::Model)
end
# Construct dynamic model functions
f_assigns = Array{Expr}(0)
g_assigns = Array{Expr}(0)
f_assigns = Array{Expr}(undef, 0)
g_assigns = Array{Expr}(undef, 0)
for i = 1:m.n_endo
push!(f_assigns, :(fvec[$i] = $(reqs[i])))
for j = 1:njcols
......@@ -292,13 +296,13 @@ function compute_dynamic_mf(m::Model)
end
@eval begin
@suppress function dynamic_mf!(yy::Vector{Float64}, x::Vector{Float64}, p::Vector{Float64}, fvec::Vector{Float64})
function dynamic_mf!(yy::Vector{Float64}, x::Vector{Float64}, p::Vector{Float64}, fvec::Vector{Float64})
$(f_assigns...)
end
end
@eval begin
@suppress function dynamic_mg!(yy::Vector{Float64}, x::Vector{Float64}, p::Vector{Float64}, fjac::Matrix{Float64})
function dynamic_mg!(yy::Vector{Float64}, x::Vector{Float64}, p::Vector{Float64}, fjac::Matrix{Float64})
$(g_assigns...)
end
end
......@@ -321,7 +325,7 @@ function compute_model_info(m::Model)
end
function calib2vec(m::Model, calib::Dict{Symbol, Float64})
p = Array{Float64}(m.n_param)
p = Array{Float64}(undef, m.n_param)
for i in 1:m.n_param
p[i] = calib[m.param[i]]
end
......@@ -329,7 +333,7 @@ function calib2vec(m::Model, calib::Dict{Symbol, Float64})
end
function initval2vec(m::Model, initval::Dict{Symbol, Float64})
y = Array{Float64}(m.n_endo)
y = Array{Float64}(undef, m.n_endo)
for i in 1:m.n_endo
y[i] = initval[m.endo[i]]
end
......@@ -337,7 +341,7 @@ function initval2vec(m::Model, initval::Dict{Symbol, Float64})
end
function exoval2vec(m::Model, exoval::Dict{Symbol, Float64})
x = Array{Float64}(m.n_exo)
x = Array{Float64}(undef, m.n_exo)
for i in 1:m.n_exo
x[i] = exoval[m.exo[i]]
end
......@@ -348,8 +352,9 @@ function steady_state(m::Model, calib::Dict{Symbol, Float64}, initval::Dict{Symb
p = calib2vec(m, calib)
iv = initval2vec(m, initval)
ev = exoval2vec(m, exoval)
mf!(y::Vector{Float64}, fvec::Vector{Float64}) = m.static_mf!(y, ev, p, fvec)
mg!(y::Vector{Float64}, fjac::Matrix{Float64}) = m.static_mg!(y, ev, p, fjac)
mf!(fvec::Vector{Float64}, y::Vector{Float64}) = m.static_mf!(y, ev, p, fvec)
mg!(fjac::Matrix{Float64}, y::Vector{Float64}, ) = m.static_mg!(y, ev, p, fjac)
r = nlsolve(mf!, mg!, iv)
@assert converged(r)
return(r.zero)
......
......@@ -4,28 +4,28 @@ function decision_rules(m::Model, calib::Dict{Symbol, Float64}, steady_state::Ve
yy = [ steady_state[m.zeta_back_mixed]; steady_state; steady_state[m.zeta_fwrd_mixed] ]
x = zeros(m.n_exo)
p = calib2vec(m, calib)
r = Array{Float64}(m.n_endo)
r = Array{Float64}(undef, m.n_endo)
m.dynamic_mf!(yy, x, p, r)
jacob = Array{Float64}(m.n_endo, n_dynvars + m.n_exo)
jacob = Array{Float64}(undef, m.n_endo, n_dynvars + m.n_exo)
m.dynamic_mg!(yy, x, p, jacob)
A = jacob[:, 1:n_dynvars]
# Deal with static variables
if m.n_static > 0
S = jacob[:, m.n_back_mixed + m.zeta_static]
F = qrfact(S)
@assert rank(F[:R]) == m.n_static
A = F[:Q]'*A
S = jacob[:, m.n_back_mixed .+ m.zeta_static]
F = qr(S)
@assert rank(F.R) == m.n_static
A = F.Q'*A
end
D = [ A[m.n_static+1:end, m.n_back_mixed + m.zeta_back_mixed] A[m.n_static+1:end, m.n_back_mixed+m.n_endo+1:end];
eye(m.n_back_mixed, m.n_back_mixed)[m.beta_back, :] zeros(m.n_mixed, m.n_fwrd_mixed) ]
D = [ A[m.n_static+1:end, m.n_back_mixed .+ m.zeta_back_mixed] A[m.n_static+1:end, m.n_back_mixed+m.n_endo+1:end];
Matrix(I, m.n_back_mixed, m.n_back_mixed)[m.beta_back, :] zeros(m.n_mixed, m.n_fwrd_mixed) ]
Atilde0plus = A[m.n_static+1:end, m.n_back_mixed + m.zeta_fwrd_mixed]
Atilde0plus = A[m.n_static + 1:end, m.n_back_mixed .+ m.zeta_fwrd_mixed]
Atilde0plus[:, m.beta_fwrd] = zeros(m.n_dynamic, m.n_mixed)
E = [ -A[m.n_static+1:end, 1:m.n_back_mixed] -Atilde0plus;
zeros(m.n_mixed, m.n_back_mixed) eye(m.n_fwrd_mixed, m.n_fwrd_mixed)[m.beta_back, :] ]
zeros(m.n_mixed, m.n_back_mixed) Matrix(I, m.n_fwrd_mixed, m.n_fwrd_mixed)[m.beta_back, :] ]
(Z, sdim, eigs) = qz!(E, D)
......@@ -44,22 +44,22 @@ function decision_rules(m::Model, calib::Dict{Symbol, Float64}, steady_state::Ve
S11 = E[1:m.n_back_mixed, 1:m.n_back_mixed]
gyminus = Z11p*(T11\S11)/Z11p
gy = Array{Float64}(m.n_endo, m.n_back_mixed)
gy = Array{Float64}(undef, m.n_endo, m.n_back_mixed)
gy[m.zeta_back_mixed, :] = gyminus
gy[m.zeta_fwrd_mixed, :] = gyplus
if m.n_static > 0
Abreve0s = A[1:m.n_static, m.n_back_mixed + m.zeta_static]
Abreve0d = A[1:m.n_static, m.n_back_mixed + m.zeta_dynamic]
Abreve0s = A[1:m.n_static, m.n_back_mixed .+ m.zeta_static]
Abreve0d = A[1:m.n_static, m.n_back_mixed .+ m.zeta_dynamic]
Abreveminus = A[1:m.n_static, 1:m.n_back_mixed]
Abreveplus = A[1:m.n_static, m.n_back_mixed+m.n_endo+1:end]
gy[m.zeta_static, :] = -Abreve0s \ (Abreveplus*gyplus*gyminus + Abreve0d*gy[m.zeta_dynamic, :] + Abreveminus)
Abreveplus = A[1:m.n_static, m.n_back_mixed .+ m.n_endo+1:end]
gy[m.zeta_static, :] = -Abreve0s \ (Abreveplus*gyplus*gyminus .+ Abreve0d*gy[m.zeta_dynamic, :] + Abreveminus)
end
# Compute DR wrt shocks
B = jacob[:, m.n_back_mixed + (1:m.n_endo)]
B[:, m.zeta_back_mixed] += jacob[:, m.n_back_mixed+m.n_endo+(1:m.n_fwrd_mixed)]*gyplus
gu = -B\jacob[:,m.n_back_mixed+m.n_endo+m.n_fwrd_mixed+1:end]
B = jacob[:, m.n_back_mixed .+ (1:m.n_endo)]
B[:, m.zeta_back_mixed] += jacob[:, m.n_back_mixed + m.n_endo .+ (1:m.n_fwrd_mixed)]*gyplus
gu = -B\jacob[:,m.n_back_mixed+m.n_endo+m.n_fwrd_mixed + 1:end]
(gy, gu, eigs)
end
......
using SparseArrays
# Computes the perfect foresight simulation of a model for periods 1...T
# - endopath is a matrix with time in columns (T+2) and with endogenous variables in rows
# first and last column are respectively initial and terminal conditions
......@@ -20,12 +22,12 @@ function perfect_foresight_simul!(m::Model, endopath::Matrix{Float64}, exopath::
Y = vec(endopath)
d1 = Array{Float64}(m.n_endo)
jacob = Array{Float64}(m.n_endo, m.n_back_mixed + m.n_endo + m.n_fwrd_mixed + m.n_exo)
d1 = Array{Float64}(undef, m.n_endo)
jacob = Array{Float64}(undef, m.n_endo, m.n_back_mixed + m.n_endo + m.n_fwrd_mixed + m.n_exo)
for iter = 1:maxit
i_cols = [m.zeta_back_mixed; m.n_endo+(1:m.n_endo); 2*m.n_endo+m.zeta_fwrd_mixed]
i_cols = [m.zeta_back_mixed; m.n_endo .+ (1:m.n_endo); 2*m.n_endo .+ m.zeta_fwrd_mixed]
i_rows = 1:m.n_endo
for it = 2:T+1
......@@ -35,19 +37,19 @@ function perfect_foresight_simul!(m::Model, endopath::Matrix{Float64}, exopath::
if it == T+1 && it == 2
idx = m.n_back_mixed+(1:m.n_endo)
elseif it == T+1
idx = 1:(m.n_back_mixed+m.n_endo)
idx = 1:(m.n_back_mixed .+ m.n_endo)
elseif it == 2
idx = m.n_back_mixed+1:(m.n_endo+m.n_fwrd_mixed)
idx = m.n_back_mixed+1:(m.n_endo .+ m.n_fwrd_mixed)
else
idx = 1:(m.n_back_mixed+m.n_endo+m.n_fwrd_mixed)
idx = 1:(m.n_back_mixed+m.n_endo .+ m.n_fwrd_mixed)
end
A[i_rows,i_cols[idx]-m.n_endo] = jacob[:, idx]
A[i_rows,i_cols[idx] .- m.n_endo] = jacob[:, idx]
res[i_rows] = d1
i_rows += m.n_endo
i_cols += m.n_endo
i_rows = i_rows .+ m.n_endo
i_cols = i_cols .+ m.n_endo
end
err = maximum(abs, res)
......@@ -57,7 +59,7 @@ function perfect_foresight_simul!(m::Model, endopath::Matrix{Float64}, exopath::
return
end
Y[m.n_endo + (1:T*m.n_endo)] += -A\res
Y[m.n_endo .+ (1:T*m.n_endo)] += -A\res
end
error("Convergence failed")
......
import Base.LinAlg.BlasInt
import Base.LinAlg.BLAS.@blasfunc
import LinearAlgebra: BlasInt
import LinearAlgebra.BLAS.@blasfunc
const liblapack = Base.liblapack_name
# Equivalent of mjdgges
# S and T are modified in place
function selctg(alphar::Ptr{Float64}, alphai::Ptr{Float64}, beta::Ptr{Float64})
criterium::Float64 = 1.0 + 1e-6
ai = unsafe_load(alphai, 1)
ar = unsafe_load(alphar, 1)
b = unsafe_load(beta, 1)
convert(BlasInt, ar^2 + ai^2 < criterium * b^2)
end
@eval begin
function qz!(S::Matrix{Float64}, T::Matrix{Float64})
function selctg(alphar::Ptr{Float64}, alphai::Ptr{Float64}, beta::Ptr{Float64})
const criterium::Float64 = 1.0 + 1e-6
ai = unsafe_load(alphai, 1)
ar = unsafe_load(alphar, 1)
b = unsafe_load(beta, 1)
convert(BlasInt, ar^2 + ai^2 < criterium * b^2)
end
selctg2 = cfunction(selctg, BlasInt, (Ptr{Float64}, Ptr{Float64}, Ptr{Float64}))
selctg2 = @cfunction(selctg, BlasInt, (Ptr{Float64}, Ptr{Float64}, Ptr{Float64}))
(n,) = size(S)
@assert size(S) == (n,n)
@assert size(T) == (n,n)
@assert stride(S, 1) == 1
@assert stride(T, 1) == 1
alphar = Array{Float64}(n)
alphai = Array{Float64}(n)
beta = Array{Float64}(n)
alphar = Array{Float64}(undef, n)
alphai = Array{Float64}(undef, n)
beta = Array{Float64}(undef, n)
lwork = 16*n+16 # Same heuristic choice than mjdgges
work = Array{Float64}(lwork)
vsl = Array{Float64}(n, n)
vsr = Array{Float64}(n, n)
bwork = Array{BlasInt}(n)
sdim = Array{BlasInt}(1)
info = Array{BlasInt}(1)
work = Array{Float64}(undef, lwork)
vsl = Array{Float64}(undef, n, n)
vsr = Array{Float64}(undef, n, n)
bwork = Array{BlasInt}(undef, n)
sdim = Array{BlasInt}(undef, 1)
info = Array{BlasInt}(undef, 1)
ccall((@blasfunc(dgges_), liblapack), Void, (Ptr{UInt8}, Ptr{UInt8}, Ptr{UInt8}, Ptr{Void},
Ptr{BlasInt}, Ptr{Float64}, Ptr{BlasInt},
Ptr{Float64}, Ptr{BlasInt}, Ptr{BlasInt},
ccall((@blasfunc(dgges_), liblapack), Nothing, (Ref{UInt8}, Ref{UInt8}, Ref{UInt8}, Ptr{Nothing},
Ref{BlasInt}, Ptr{Float64}, Ref{BlasInt},
Ptr{Float64}, Ref{BlasInt}, Ref{BlasInt},
Ptr{Float64}, Ptr{Float64}, Ptr{Float64},
Ptr{Float64}, Ptr{BlasInt},
Ptr{Float64}, Ptr{BlasInt},
Ptr{Float64}, Ptr{BlasInt},
Ptr{BlasInt}, Ptr{BlasInt}),
&'N', &'V', &'S', selctg2, &n, S, &stride(S, 2), T, &stride(T, 2),
sdim, alphar, alphai, beta, vsl, &stride(vsl, 2),
vsr, &stride(vsr, 2), work, &lwork, bwork, info)
Ptr{Float64}, Ref{BlasInt},
Ptr{Float64}, Ref{BlasInt},
Ptr{Float64}, Ref{BlasInt},
Ref{BlasInt}, Ptr{BlasInt}),
'N', 'V', 'S', selctg2, n, S, stride(S, 2), T, stride(T, 2),
sdim, alphar, alphai, beta, vsl, stride(vsl, 2),
vsr, stride(vsr, 2), work, lwork, bwork, info)
@assert info[1] == 0
eigs = Array{Complex128}(n)
eigs = Array{ComplexF64}(undef, n)
for i = 1:n
eigs[i] = alphar[i]/beta[i] + (alphai[i] == 0 && beta[i] == 0 ? 0.0 : alphai[i]/beta[i])*im
end
......
......@@ -48,7 +48,7 @@ print_steady_state(m, s)
# condition, i.e. it goes from t=0 to t=201)
T = 200
endopath = repmat(s, 1, T+2)
endopath = repeat(s, 1, T+2)
exopath = ones(m.n_exo, T)
exopath[1, 1] = 1.2
......
if isempty(findin([abspath("../src")], LOAD_PATH))
unshift!(LOAD_PATH, abspath("../src"))
if isempty(findall((in)(LOAD_PATH), abspath("../src") ))
push!(LOAD_PATH, abspath("../src"))
end
using Dynare
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment