Home > . > set_state_space.m

set_state_space

PURPOSE ^

Copyright (C) 2001 Michel Juillard

SYNOPSIS ^

function dr=set_state_space(dr)

DESCRIPTION ^

 Copyright (C) 2001 Michel Juillard

CROSS-REFERENCE INFORMATION ^

This function calls: This function is called by:

SOURCE CODE ^

0001 % Copyright (C) 2001 Michel Juillard
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));  % static variables
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 % building kmask for z state vector in t+1
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);          % index of nonzero entries in kmask
0046 nd = size(i_kmask,1);           % size of the state vector
0047 kmask(i_kmask) = [1:nd];
0048 
0049 % auxiliary equations
0050 
0051 % elements that are both in z(t+1) and z(t)
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 % composition of state vector
0061 % col 1: variable;           col 2: lead/lag in z(t+1);
0062 % col 3: A cols for t+1 (D); col 4: A cols for t (E)
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 % put in E only the current variables that are not already in D
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 % number of forward variables in the state vector
0082 dr.nsfwrd = sum(kstate(:,2) > M_.maximum_lag+1);
0083 % number of predetermined variables in the state vector
0084 dr.nspred = sum(kstate(:,2) <= M_.maximum_lag+1);

Generated on Fri 16-Jun-2006 09:09:06 by m2html © 2003