diff --git a/matlab/partial_information/dr1_PI.m b/matlab/partial_information/dr1_PI.m index 2a3b289fe57c82d0f30325d0f50dd7e75470f13d..3f47cd7589cb22ac229c73dc27ac9e7655f713aa 100644 --- a/matlab/partial_information/dr1_PI.m +++ b/matlab/partial_information/dr1_PI.m @@ -57,8 +57,6 @@ info = 0; options_ = set_default_option(options_,'qz_criterium',1.000001); -xlen = M_.maximum_endo_lead + M_.maximum_endo_lag + 1; - if options_.aim_solver error('Anderson and Moore AIM solver is not compatible with Partial Information models'); end % end if useAIM and... @@ -68,69 +66,32 @@ if (options_.order > 1) options_.order =1; end -klen = M_.maximum_lag + M_.maximum_lead + 1; -iyv = M_.lead_lag_incidence'; - if M_.exo_nbr == 0 oo_.exo_steady_state = [] ; end -z = repmat(dr.ys,1,klen); -z = z(find(iyv(:))) ; -[~,jacobia_] = feval([M_.fname '.dynamic'],z,[oo_.exo_simul ... - oo_.exo_det_simul], M_.params, dr.ys, M_.maximum_lag + 1); +g1 = feval([M_.fname '.sparse.dynamic_g1'], repmat(dr.ys, 3, 1), [oo_.exo_steady_state; oo_.exo_det_steady_state], ... + M_.params, dr.ys, M_.dynamic_g1_sparse_rowval, M_.dynamic_g1_sparse_colval, ... + M_.dynamic_g1_sparse_colptr); if options_.debug save([M_.dname filesep 'Output' filesep M_.fname '_debug.mat'],'jacobia_') end -% find size xlen of the state vector Y and of A0, A1 and A2 transition matrices: -% it is the sum the all i variables's lag/lead representations, -% for each variable i representation being defined as: -% Max (i_lags-1,0)+ Max (i_leads-1,0)+1 -% so that if variable x appears with 2 lags and 1 lead, and z -% with 2 lags and 3 leads, the size of the state space is: -% 1+0+1 + 1+2+1 =6 -% e.g. E_t Y(t+1)= -% E_t x(t) -% E_t x(t+1) -% E_t z(t) -% E_t z(t+1) -% E_t z(t+2) -% E_t z(t+3) - -% partition jacobian: -jlen=M_.nspred+M_.nsfwrd+M_.endo_nbr+M_.exo_nbr; % length of jacobian -% first transpose M_.lead_lag_incidence'; -lead_lag=M_.lead_lag_incidence'; -if ( M_.maximum_lag <= 1) && (M_.maximum_lead <= 1) - xlen=size(jacobia_,1);%nendo; - AA0=zeros(xlen,xlen); % empty A0 - AA2=AA0; % empty A2 and A3 - AA3=AA0; - if xlen==M_.endo_nbr % && M_.maximum_lag <=1 && M_.maximum_lead <=1 % apply a shortcut - AA1=jacobia_(:,M_.nspred+1:M_.nspred+M_.endo_nbr); - if M_.maximum_lead ==1 - fnd = find(lead_lag(:,M_.maximum_lag+2)); - AA0(:, fnd)= jacobia_(:,nonzeros(lead_lag(:,M_.maximum_lag+2))); %forwd jacobian - end - if M_.nspred>0 && M_.maximum_lag ==1 - fnd = find(lead_lag(:,1)); - AA2(:, fnd)= jacobia_(:,nonzeros(lead_lag(:,1))); %backward - end - else - error('More than one lead or lag in the jabian'); - end - if M_.orig_endo_nbr<M_.endo_nbr - % findif there are any expectations at time t - exp_0= strmatch('AUX_EXPECT_LEAD_0_', M_.endo_names); - if ~isempty(exp_0) - error('Partial Information does not support EXPECTATION(0) operators') - end +AA2=full(g1(:,1:M_.endo_nbr)); % Jacobian for lagged endos +AA1=full(g1(:,M_.endo_nbr+(1:M_.endo_nbr))); % Jacobian for contemporaneous endos +AA0=full(g1(:,2*M_.endo_nbr+(1:M_.endo_nbr))); % Jacobian for leaded endos +PSI=-full(g1(:,3*M_.endo_nbr+1:end)); % Jacobian for (contemporaneous) exos + +if M_.orig_endo_nbr<M_.endo_nbr + % findif there are any expectations at time t + exp_0= strmatch('AUX_EXPECT_LEAD_0_', M_.endo_names); + if ~isempty(exp_0) + error('Partial Information does not support EXPECTATION(0) operators') end end -PSI=-[[zeros(xlen-M_.endo_nbr,M_.exo_nbr)];[jacobia_(:, jlen-M_.exo_nbr+1:end)]]; % exog + cc=0; try @@ -145,11 +106,7 @@ try % y(t)=[TT1 TT2][s(t)' x(t)']'. %% for expectational models when complete - if any(AA3) - error('Unsupported case') - else - [G1pi,CC,impact,nmat,TT1,TT2,gev,eu, DD, E2,E5, GAMMA, FL_RANK]=PI_gensys(AA0,AA1,-AA2,cc,PSI,M_.exo_nbr); - end + [G1pi,CC,impact,nmat,TT1,TT2,gev,eu, DD, E2,E5, GAMMA, FL_RANK]=PI_gensys(AA0,AA1,-AA2,cc,PSI,M_.exo_nbr); % reuse some of the bypassed code and tests that may be needed if (eu(1) ~= 1 || eu(2) ~= 1) @@ -175,4 +132,4 @@ try catch ME disp('Problem with using Part Info solver'); rethrow(ME); -end \ No newline at end of file +end