diff --git a/matlab/check.m b/matlab/check.m index 457eb9d1d88584e6e29ab9ef250b1277f7f2c349..15642a22cf6525fe84fcbd1e10cbf96786367d16 100644 --- a/matlab/check.m +++ b/matlab/check.m @@ -59,7 +59,7 @@ global it_ if(options_.model_mode == 1) nyf = dr.nyf; else - nyf = nnz(dr.kstate(:,2)>M_.maximum_lag+1); + nyf = nnz(dr.kstate(:,2)>M_.maximum_endo_lag+1); end; [m_lambda,i]=sort(abs(eigenvalues_)); n_explod = nnz(abs(eigenvalues_) > options_.qz_criterium); diff --git a/matlab/dr11_sparse.m b/matlab/dr11_sparse.m index 7fddf48e7a37bfe70e85760ff262d12ad3e9e65a..1a2f7cc0528b9420c1a76a28c8e021e689ae2124 100644 --- a/matlab/dr11_sparse.m +++ b/matlab/dr11_sparse.m @@ -23,34 +23,18 @@ function [dr,info,M_,options_,oo_] = dr11_sparse(dr,task,M_,options_,oo_, jacobi kstate = dr.kstate; kad = dr.kad; kae = dr.kae; - %kstate - %kad - %kae nstatic = dr.nstatic; nfwrd = dr.nfwrd; npred = dr.npred; nboth = dr.nboth; - %nstatic - %nfwrd - %npred - %nboth order_var = dr.order_var; - %order_var nd = size(kstate,1); - %nd nz = nnz(M_.lead_lag_incidence); - %nz sdyn = M_.endo_nbr - nstatic; - %sdyn -% M_.lead_lag_incidence k0 = M_.lead_lag_incidence(M_.maximum_endo_lag+1,order_var); k1 = M_.lead_lag_incidence(find([1:klen] ~= M_.maximum_endo_lag+1),:); -% size(jacobia_) -% k0 - %k1 b = jacobia_(:,k0); - %full(b) if M_.maximum_endo_lead == 0; % backward models a = jacobia_(:,nonzeros(k1')); @@ -75,7 +59,6 @@ function [dr,info,M_,options_,oo_] = dr11_sparse(dr,task,M_,options_,oo_, jacobi end return; end - %forward--looking models if nstatic > 0 [Q,R] = qr(b(:,1:nstatic)); @@ -83,14 +66,8 @@ function [dr,info,M_,options_,oo_] = dr11_sparse(dr,task,M_,options_,oo_, jacobi else aa = jacobia_; end -% full(aa) a = aa(:,nonzeros(k1')); b = aa(:,k0); - %M_.lead_lag_incidence - %k0 - %k1 - %a - %b b10 = b(1:nstatic,1:nstatic); b11 = b(1:nstatic,nstatic+1:end); b2 = b(nstatic+1:end,nstatic+1:end); @@ -100,9 +77,9 @@ function [dr,info,M_,options_,oo_] = dr11_sparse(dr,task,M_,options_,oo_, jacobi end % buildind D and E + %nd d = zeros(nd,nd) ; e = d ; - k = find(kstate(:,2) >= M_.maximum_endo_lag+2 & kstate(:,3)); d(1:sdyn,k) = a(nstatic+1:end,kstate(k,3)) ; k1 = find(kstate(:,2) == M_.maximum_endo_lag+2); @@ -124,10 +101,6 @@ function [dr,info,M_,options_,oo_] = dr11_sparse(dr,task,M_,options_,oo_, jacobi [ss,tt,w,sdim,dr.eigval,info1] = mjdgges(e,d,options_.qz_criterium); - %ss - %tt - %sdim - %fprintf('%20.16f\n',dr.eigval) if info1 info(1) = 2; @@ -138,14 +111,13 @@ function [dr,info,M_,options_,oo_] = dr11_sparse(dr,task,M_,options_,oo_, jacobi nba = nd-sdim; nyf = sum(kstate(:,2) > M_.maximum_endo_lag+1); - %disp(['task' num2str(task)]); + if task == 1 dr.rank = rank(w(1:nyf,nd-nyf+1:end)); % Under Octave, eig(A,B) doesn't exist, and % lambda = qz(A,B) won't return infinite eigenvalues if ~exist('OCTAVE_VERSION') dr.eigval = eig(e,d); -% dr.eigval end return end diff --git a/matlab/dr1_sparse.m b/matlab/dr1_sparse.m index 064d307ceb2f5cbbc04c028fe3865577b540c7fa..acef2657e99b6cf05a099c65259ac7dcf96411a3 100644 --- a/matlab/dr1_sparse.m +++ b/matlab/dr1_sparse.m @@ -214,11 +214,12 @@ function [dr,info,M_,options_,oo_] = dr1_sparse(dr,task,M_,options_,oo_) dr.nyf = 0; dr.rank = 0; for i=1:length(M_.block_structure.block) - %disp(['block ' num2str(i)]); M_.block_structure.block(i).dr.Null=0; M_.block_structure.block(i).dr=set_state_space(M_.block_structure.block(i).dr,M_.block_structure.block(i)); - jcb_=jacobia_(M_.block_structure.block(i).equation,repmat(M_.block_structure.block(i).variable,1,M_.block_structure.block(i).maximum_endo_lag+M_.block_structure.block(i).maximum_endo_lead+1)+kron([M_.maximum_endo_lag-M_.block_structure.block(i).maximum_endo_lag:M_.maximum_endo_lag+M_.block_structure.block(i).maximum_endo_lead],M_.endo_nbr*ones(1,M_.block_structure.block(i).endo_nbr))); - jcb_=jcb_(:,find(any(jcb_,1))); + col_selector=repmat(M_.block_structure.block(i).variable,1,M_.block_structure.block(i).maximum_endo_lag+M_.block_structure.block(i).maximum_endo_lead+1)+kron([M_.maximum_endo_lag-M_.block_structure.block(i).maximum_endo_lag:M_.maximum_endo_lag+M_.block_structure.block(i).maximum_endo_lead],M_.endo_nbr*ones(1,M_.block_structure.block(i).endo_nbr)); + row_selector = M_.block_structure.block(i).equation; + jcb_=jacobia_(row_selector,col_selector); + jcb_ = jcb_(:,find(M_.block_structure.block(i).lead_lag_incidence')) ; hss_=0; %hessian(M_.block_structure.block(i).equation,M_.block_structure.block(i).variable); dra = M_.block_structure.block(i).dr; M_.block_structure.block(i).exo_nbr=M_.exo_nbr; diff --git a/matlab/dynare_m.exe b/matlab/dynare_m.exe index a400646cdd77e1b960d405df9b4aef077dfde04b..f17104b7477ad53dd96df63b255e4d9797c4cbd5 100755 Binary files a/matlab/dynare_m.exe and b/matlab/dynare_m.exe differ diff --git a/preprocessor/ModelTree.cc b/preprocessor/ModelTree.cc index 7a110a4ca84d2c049ecc724a398244b357139bd0..c6bef42d5faa37f0f5e1d691bb5684355186a88f 100644 --- a/preprocessor/ModelTree.cc +++ b/preprocessor/ModelTree.cc @@ -32,7 +32,7 @@ ModelTree::ModelTree(SymbolTable &symbol_table_arg, NumericalConstants &num_constants_arg) : DataTree(symbol_table_arg, num_constants_arg), mode(eStandardMode), - cutoff(1e-12), + cutoff(1e-15), markowitz(0.7), new_SGE(true), computeJacobian(false), @@ -543,7 +543,9 @@ ModelTree::writeModelEquationsOrdered_M(ostream &output, Model_Block *ModelBlock { if(ModelBlock->Block_List[j].IM_lead_lag[m].Var_Index[i]==ModelBlock->Block_List[j].Variable[0]) { - output << " g1(M_.block_structure.block(" << gen_blocks << ").equation(" << count_derivates << "), M_.block_structure.block(" << gen_blocks << ").variable(" << count_derivates << ")+" << (m+variable_table.max_endo_lag-ModelBlock->Block_List[j].Max_Lag)*symbol_table.endo_nbr << ")="; + //output << " g1(M_.block_structure.block(" << gen_blocks << ").equation(" << count_derivates << "), M_.block_structure.block(" << gen_blocks << ").variable(" << count_derivates << ")+" << (m+variable_table.max_endo_lag-ModelBlock->Block_List[j].Max_Lag)*symbol_table.endo_nbr << ")="; + //output << " g1(M_.block_structure.block(" << gen_blocks << ").equation(" << count_derivates << "), M_.block_structure.block(" << gen_blocks << ").variable(" << count_derivates << ")+" << (m+variable_table.max_endo_lag-ModelBlock->Block_List[j].Max_Lag)*symbol_table.endo_nbr << ")="; + output << " g1(" << ModelBlock->Block_List[j].Equation[0]+1 << ", " << ModelBlock->Block_List[j].Variable[0]+1 + (m+variable_table.max_endo_lag-ModelBlock->Block_List[j].Max_Lag)*symbol_table.endo_nbr << ")="; writeDerivative(output, ModelBlock->Block_List[j].Equation[0], ModelBlock->Block_List[j].Variable[0], k, oMatlabDynamicModelSparse, temporary_terms); output << "; % variable=" << symbol_table.getNameByID(eEndogenous, ModelBlock->Block_List[j].Variable[0]) << "(" << variable_table.getLag(variable_table.getSymbolID(ModelBlock->Block_List[j].Variable[0])) @@ -2124,9 +2126,12 @@ ModelTree::writeSparseDynamicMFile(const string &dynamic_basename, const string break; case SOLVE_FORWARD_SIMPLE: case SOLVE_BACKWARD_SIMPLE: - mDynamicModelFile << " y_index=" << block_triangular.ModelBlock->Block_List[i].Variable[0]+1 << ";\n"; + mDynamicModelFile << " y_index_eq = " << block_triangular.ModelBlock->Block_List[i].Equation[0]+1 << ";\n"; + mDynamicModelFile << " y_index = " << block_triangular.ModelBlock->Block_List[i].Variable[0]+1 << ";\n"; mDynamicModelFile << " [r, g1, g2, g3]=" << dynamic_basename << "_" << i + 1 << "(y, x, it_, g1, g2, g3, y_index, 1);\n"; mDynamicModelFile << " residual(y_index_eq)=r;\n"; + tmp_eq.str(""); + tmp.str(""); break; case SOLVE_FORWARD_COMPLETE: case SOLVE_BACKWARD_COMPLETE: @@ -2140,6 +2145,7 @@ ModelTree::writeSparseDynamicMFile(const string &dynamic_basename, const string //tmp_i=variable_table.max_lag+variable_table.max_lead+1; mDynamicModelFile << " ga = [];\n"; mDynamicModelFile << " ga=spalloc(" << block_triangular.ModelBlock->Block_List[i].Size << ", " << block_triangular.ModelBlock->Block_List[i].Size*tmp_i << ", " << block_triangular.ModelBlock->Block_List[i].Size*block_triangular.ModelBlock->Block_List[i].Size*tmp_i << ");\n"; + //mDynamicModelFile << " [r, g1, g2, g3, b]=" << dynamic_basename << "_" << i + 1 << "(y, x, it_, 1, ga, g2, g3);\n"; mDynamicModelFile << " [r, ga, g2, g3, b]=" << dynamic_basename << "_" << i + 1 << "(y, x, it_, 1, ga, g2, g3);\n"; mDynamicModelFile << " g1(y_index_eq,y_index_c) = ga;\n"; mDynamicModelFile << " residual(y_index_eq)=r;\n"; @@ -2159,6 +2165,7 @@ ModelTree::writeSparseDynamicMFile(const string &dynamic_basename, const string mDynamicModelFile << " for i=1:" << tmp_i-1 << ",\n"; mDynamicModelFile << " y_index_c = [y_index_c (y_index+i*y_size)];\n"; mDynamicModelFile << " end;\n"; + //mDynamicModelFile << " [r, g1, g2, g3, b]=" << dynamic_basename << "_" << i + 1 << "(y, x, it_-1, " << block_triangular.ModelBlock->Block_List[i].Size << ", 1, ga, g2, g3);\n"; mDynamicModelFile << " [r, ga, g2, g3, b]=" << dynamic_basename << "_" << i + 1 << "(y, x, it_-1, " << block_triangular.ModelBlock->Block_List[i].Size << ", 1, ga, g2, g3);\n"; if(block_triangular.ModelBlock->Block_List[i].Max_Lag==variable_table.max_lag && block_triangular.ModelBlock->Block_List[i].Max_Lead==variable_table.max_lead) mDynamicModelFile << " g1(y_index_eq,y_index_c) = ga;\n"; @@ -2877,6 +2884,8 @@ ModelTree::writeOutput(ostream &output) const output << "M_.block_structure.block(" << k << ").equation = [" << tmp_s_eq.str() << "];\n"; output << "M_.block_structure.block(" << k << ").variable = [" << tmp_s.str() << "];\n"; tmp_s.str(""); + cout << "begining of lead_lag_incidence\n"; + bool done_IM=false; if(!evaluate) { diff --git a/tests/ferhat/fs2000.mod b/tests/ferhat/fs2000.mod index 645db083366ca2ed2067e67f3afae75d4c1326d3..c223ba774233ef5fa7075c91a3b54771a16ecab4 100644 --- a/tests/ferhat/fs2000.mod +++ b/tests/ferhat/fs2000.mod @@ -18,7 +18,7 @@ // // Michel Juillard, February 2004 -var m P c e W R k d n l gy_obs gp_obs y dA; +var m P c e W R k d n l gy_obs gp_obs y dA vv ww; varexo e_a e_m; parameters alp bet gam mst rho psi del; @@ -48,6 +48,19 @@ e = exp(e_a); y = k(-1)^alp*n^(1-alp)*exp(-alp*(gam+e_a)); gy_obs = dA*y/y(-1); gp_obs = (P/P(-1))*m(-1)/dA; +vv = 0.2*ww+0.5*vv(-1)+1; +ww = 0.1*vv+0.5*ww(-1)+2; +/* A lt= + 0.5*vv-0.2*ww = 1 +-0.1*vv+0.5*ww = 2 +[ 0.5 -0.2][vv] [1] + = +[-0.1 0.5][ww] [2] +det = 0.25-0.02 = 0.23 +[vv] [0.5 0.2] [1] [0.9] [3.91304] + = 1/0.23* = 1/0.23* = +[ww] [0.1 0.5] [2] [1.1] [4.7826] +*/ end; initval; @@ -67,6 +80,8 @@ gp_obs = exp(-gam); dA = exp(gam); e_a=0; e_m=0; +vv = 0; +ww = 0; end; /*shocks; diff --git a/tests/ferhat/ls2003.mod b/tests/ferhat/ls2003.mod index c8339f5a87ba60b3439f718d6301d4f02beed0ec..21e2cdf626c220658248caf560ce8dd1b1850215 100644 --- a/tests/ferhat/ls2003.mod +++ b/tests/ferhat/ls2003.mod @@ -17,7 +17,7 @@ rho_ys = 0.9; rho_pies = 0.7; -//model(sparse_dll,gcc_compiler,cutoff=1e-17); +//model(sparse_dll,cutoff=1e-17); model(sparse); //model; y = y(+1) - (tau +alpha*(2-alpha)*(1-tau))*(R-pie(+1))-alpha*(tau +alpha*(2-alpha)*(1-tau))*dq(+1) + alpha*(2-alpha)*((1-tau)/tau)*(y_s-y_s(+1))-A(+1); @@ -68,7 +68,7 @@ estimation(datafile=data_ca1,first_obs=8,nobs=79,mh_nblocks=10,prefilter=1,mh_js */ steady; -model_info; +//model_info; check; shocks; @@ -77,6 +77,6 @@ periods 1; values 0.5; end; -simul(periods=200,method=bicgstab); -rplot A; -rplot pie; +//simul(periods=200,method=bicgstab); +//rplot A; +//rplot pie;