Added specialized code for static models.
parent
65968bb134
commit
14819abb5f
|
@ -178,22 +178,28 @@ if isequal(length(equal_id),1)
|
||||||
if length(assignedvariablename)>1
|
if length(assignedvariablename)>1
|
||||||
error('No more than one variable can be assigned!')
|
error('No more than one variable can be assigned!')
|
||||||
end
|
end
|
||||||
% Check that the dynamic model for the endogenous variable is not forward looking.
|
% Check if the model is static
|
||||||
start = regexpi(assignedvariablename{1},'\(t\)|\(t\-\d\)|\(t\+\d\)');
|
start = regexpi(assignedvariablename{1},'\(t\)|\(t\-\d\)|\(t\+\d\)');
|
||||||
index = assignedvariablename{1}(start:end);
|
index = assignedvariablename{1}(start:end);
|
||||||
assignedvariablename = assignedvariablename{1}(1:start-1);
|
assignedvariablename = assignedvariablename{1}(1:start-1);
|
||||||
indum = index2num(index);
|
|
||||||
indva = strmatch(assignedvariablename, leadlagtable(:,1));
|
indva = strmatch(assignedvariablename, leadlagtable(:,1));
|
||||||
|
dynamicmodel = ~isempty(regexpi(EXPRESSION(equal_id:end), sprintf('%s\\(t\\)|%s\\(t\\-\\d\\)|%s\\(t\\+\\d\\)',assignedvariablename,assignedvariablename,assignedvariablename),'match'));
|
||||||
|
% Check that the dynamic model for the endogenous variable is not forward looking.
|
||||||
|
if dynamicmodel
|
||||||
|
indum = index2num(index);
|
||||||
if indum<leadlagtable{indva,4}
|
if indum<leadlagtable{indva,4}
|
||||||
error('dseries::from: It is not possible to simulate a forward looking model!')
|
error('dseries::from: It is not possible to simulate a forward looking model!')
|
||||||
end
|
end
|
||||||
|
end
|
||||||
% Check that the assigned variable does not depend on itself (the assigned variable can depend on its past level but not on the current level).
|
% Check that the assigned variable does not depend on itself (the assigned variable can depend on its past level but not on the current level).
|
||||||
|
if dynamicmodel
|
||||||
tmp = regexpi(EXPRESSION(equal_id+1:end), sprintf('%s\\(t\\)|%s\\(t\\-\\d\\)|%s\\(t\\+\\d\\)',assignedvariablename,assignedvariablename,assignedvariablename),'match');
|
tmp = regexpi(EXPRESSION(equal_id+1:end), sprintf('%s\\(t\\)|%s\\(t\\-\\d\\)|%s\\(t\\+\\d\\)',assignedvariablename,assignedvariablename,assignedvariablename),'match');
|
||||||
tmp = cellfun(@extractindex, tmp);
|
tmp = cellfun(@extractindex, tmp);
|
||||||
tmp = cellfun(@index2num, tmp);
|
tmp = cellfun(@index2num, tmp);
|
||||||
if ~all(tmp(:)<indum)
|
if ~all(tmp(:)<indum)
|
||||||
error(sprintf('dseries::from: On the righthand side, the endogenous variable, %s, must be indexed by %s at most.',assignedvariablename,num2index(indum-1)))
|
error(sprintf('dseries::from: On the righthand side, the endogenous variable, %s, must be indexed by %s at most.',assignedvariablename,num2index(indum-1)))
|
||||||
end
|
end
|
||||||
|
end
|
||||||
else
|
else
|
||||||
error('Not yet implemented! Only one assignment is allowed in the FROM-TO-DO statement.')
|
error('Not yet implemented! Only one assignment is allowed in the FROM-TO-DO statement.')
|
||||||
end
|
end
|
||||||
|
@ -216,8 +222,9 @@ t2 = find(d2==tmp.dates);
|
||||||
% Get data
|
% Get data
|
||||||
data = tmp.data;
|
data = tmp.data;
|
||||||
|
|
||||||
% Transform EXPRESSION by replacing calls to the dseries objects by references to data.
|
if dynamicmodel
|
||||||
for i=1:number_of_variables
|
% Transform EXPRESSION by replacing calls to the dseries objects by references to data.
|
||||||
|
for i=1:number_of_variables
|
||||||
EXPRESSION = regexprep(EXPRESSION,sprintf('%s\\(t\\)',leadlagtable{i,1}),sprintf('data(t,%s)',num2str(i)));
|
EXPRESSION = regexprep(EXPRESSION,sprintf('%s\\(t\\)',leadlagtable{i,1}),sprintf('data(t,%s)',num2str(i)));
|
||||||
for j=1:length(leadlagtable{i,5})
|
for j=1:length(leadlagtable{i,5})
|
||||||
lag = leadlagtable{i,5}(j);
|
lag = leadlagtable{i,5}(j);
|
||||||
|
@ -227,11 +234,30 @@ for i=1:number_of_variables
|
||||||
lead = leadlagtable{i,6}(j);
|
lead = leadlagtable{i,6}(j);
|
||||||
EXPRESSION = regexprep(EXPRESSION,sprintf('%s\\(t+%s\\)',leadlagtable{i,1},num2str(lead)),sprintf('data(t+%s,%s)',num2str(lead),num2str(i)));
|
EXPRESSION = regexprep(EXPRESSION,sprintf('%s\\(t+%s\\)',leadlagtable{i,1},num2str(lead)),sprintf('data(t+%s,%s)',num2str(lead),num2str(i)));
|
||||||
end
|
end
|
||||||
|
end
|
||||||
|
% Do the job. Evaluate the recursion.
|
||||||
|
eval(sprintf('for t=%s:%s, %s; end',num2str(t1),num2str(t2),EXPRESSION));
|
||||||
|
else
|
||||||
|
% Transform EXPRESSION by replacing calls to the dseries objects by references to data.
|
||||||
|
for i=1:number_of_variables
|
||||||
|
EXPRESSION = regexprep(EXPRESSION,sprintf('%s\\(t\\)',leadlagtable{i,1}),sprintf('data(%s:%s,%s)',num2str(t1),num2str(t2),num2str(i)));
|
||||||
|
for j=1:length(leadlagtable{i,5})
|
||||||
|
lag = leadlagtable{i,5}(j);
|
||||||
|
EXPRESSION = regexprep(EXPRESSION,sprintf('%s\\(t-%s\\)',leadlagtable{i,1},num2str(lag)),sprintf('data(%s:%s,%s)',num2str(t1-lag),num2str(t2-lag),num2str(i)));
|
||||||
|
end
|
||||||
|
for j=1:length(leadlagtable{i,6})
|
||||||
|
lead = leadlagtable{i,6}(j);
|
||||||
|
EXPRESSION = regexprep(EXPRESSION,sprintf('%s\\(t+%s\\)',leadlagtable{i,1},num2str(lead)),sprintf('data(%s:%s,%s)',num2str(t1-lead),num2str(t2-lead),num2str(i)));
|
||||||
|
end
|
||||||
|
end
|
||||||
|
% Transform some operators (^ -> .^, / -> ./, * -> .*)
|
||||||
|
EXPRESSION = strrep(EXPRESSION,'^','.^');
|
||||||
|
EXPRESSION = strrep(EXPRESSION,'*','.*');
|
||||||
|
EXPRESSION = strrep(EXPRESSION,'/','./');
|
||||||
|
% Do the job. Evaluate the static expression.
|
||||||
|
eval(sprintf('%s;',EXPRESSION));
|
||||||
end
|
end
|
||||||
|
|
||||||
% Do the job. Evaluate the recursion.
|
|
||||||
eval(sprintf('for t=%s:%s, %s; end',num2str(t1),num2str(t2),EXPRESSION));
|
|
||||||
|
|
||||||
% Put assigned variable back in the caller workspace...
|
% Put assigned variable back in the caller workspace...
|
||||||
eval(sprintf('assignin(''caller'', ''%s'', dseries(data(:,indva),y.init,y.name,y.tex));',assignedvariablename))
|
eval(sprintf('assignin(''caller'', ''%s'', dseries(data(:,indva),y.init,y.name,y.tex));',assignedvariablename))
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue