0001
0002
0003 function dr=set_state_space(dr)
0004
0005 global M_ oo_ options_ it_
0006
0007 xlen = M_.maximum_lead + M_.maximum_lag + 1;
0008 klen = M_.maximum_lag + M_.maximum_lead + 1;
0009
0010 if ~ M_.lead_lag_incidence(M_.maximum_lag+1,:) > 0
0011 error ('Error in model specification: some variables don"t appear as current') ;
0012 end
0013
0014 fwrd_var = find(any(M_.lead_lag_incidence(M_.maximum_lag+2:end,:),1))';
0015 if M_.maximum_lag > 0
0016 pred_var = find(any(M_.lead_lag_incidence(1:M_.maximum_lag,:),1))';
0017 both_var = intersect(pred_var,fwrd_var);
0018 pred_var = setdiff(pred_var,both_var);
0019 fwrd_var = setdiff(fwrd_var,both_var);
0020 stat_var = setdiff([1:M_.endo_nbr]',union(union(pred_var,both_var),fwrd_var));
0021 else
0022 pred_var = [];
0023 both_var = [];
0024 stat_var = setdiff([1:M_.endo_nbr]',fwrd_var);
0025 end
0026 nboth = length(both_var);
0027 npred = length(pred_var);
0028 nfwrd = length(fwrd_var);
0029 nstatic = length(stat_var);
0030 order_var = [ stat_var; pred_var; both_var; fwrd_var];
0031
0032
0033 if M_.maximum_lag > 0
0034 kmask = [];
0035 if M_.maximum_lead > 0
0036 kmask = [cumsum(flipud(M_.lead_lag_incidence(M_.maximum_lag+2:end,order_var)),1)] ;
0037 end
0038 kmask = [kmask; flipud(cumsum(M_.lead_lag_incidence(1:M_.maximum_lag,order_var),1))] ;
0039 else
0040 kmask = cumsum(flipud(M_.lead_lag_incidence(M_.maximum_lag+2:klen,order_var)),1) ;
0041 end
0042
0043 kmask = kmask';
0044 kmask = kmask(:);
0045 i_kmask = find(kmask);
0046 nd = size(i_kmask,1);
0047 kmask(i_kmask) = [1:nd];
0048
0049
0050
0051
0052 k1 = find([kmask(1:end-M_.endo_nbr) & kmask(M_.endo_nbr+1:end)] );
0053 kad = [];
0054 kae = [];
0055 if ~isempty(k1)
0056 kad = kmask(k1+M_.endo_nbr);
0057 kae = kmask(k1);
0058 end
0059
0060
0061
0062
0063 kstate = [ repmat([1:M_.endo_nbr]',klen-1,1) kron([klen:-1:2]',ones(M_.endo_nbr,1)) ...
0064 zeros((klen-1)*M_.endo_nbr,2)];
0065 kiy = flipud(M_.lead_lag_incidence(:,order_var))';
0066 kiy = kiy(:);
0067 kstate(1:M_.maximum_lead*M_.endo_nbr,3) = kiy(1:M_.maximum_lead*M_.endo_nbr)-M_.endo_nbr;
0068 kstate(find(kstate(:,3) < 0),3) = 0;
0069 kstate(M_.maximum_lead*M_.endo_nbr+1:end,4) = kiy((M_.maximum_lead+1)*M_.endo_nbr+1:end);
0070
0071 kstate = kstate(i_kmask,:);
0072
0073 dr.order_var = order_var;
0074 dr.nstatic = nstatic;
0075 dr.npred = npred+nboth;
0076 dr.kstate = kstate;
0077 dr.kad = kad;
0078 dr.kae = kae;
0079 dr.nboth = nboth;
0080 dr.nfwrd = nfwrd;
0081
0082 dr.nsfwrd = sum(kstate(:,2) > M_.maximum_lag+1);
0083
0084 dr.nspred = sum(kstate(:,2) <= M_.maximum_lag+1);