From dfea83e0d03223dd4b60a309b2b0a8e906a11ffc Mon Sep 17 00:00:00 2001 From: Houtan Bastani <houtan@dynare.org> Date: Thu, 20 Nov 2014 15:47:52 +0100 Subject: [PATCH] dmm: if possible, combine two latent vars that impact the same matrix --- matlab/writeDmmNmlFile.m | 94 ++++++++++++++++++++-------------------- 1 file changed, 48 insertions(+), 46 deletions(-) diff --git a/matlab/writeDmmNmlFile.m b/matlab/writeDmmNmlFile.m index 664427b7d4..def6ae91b0 100644 --- a/matlab/writeDmmNmlFile.m +++ b/matlab/writeDmmNmlFile.m @@ -38,14 +38,6 @@ end fprintf(fid, '%s.nml file generated by Dynare\n', M_.fname); fprintf(fid, 'from %s.mod on %d-%d-%d at %d:%d:%d\n', M_.fname, fix(clock)); -%% SSM -fprintf(fid, '\n&ssm\n'); -fprintf(fid, 'nu=%d nv=%d nx=%d d=%d %d dllname=''%s'' check=''%s''', M_.exo_nbr, ... - size(options_.multinomial, 2), options_.dmm.nx, ... - options_.dmm.max_order_of_integration, options_.dmm.num_nonstationary, ... - [cd filesep M_.fname '_dmm.m'], options_.dmm.check_mats); -fprintf(fid, '\n&end\n'); - %% Prior fprintf(fid, '\n&prior\n'); nt = size(estimation_info.parameter,2); @@ -77,6 +69,53 @@ fprintf(fid, 'seed=%d thin=%d burnin=%d simulrec=%d hbl=%d MargLik=''%s''', ... options_.dmm.calc_marg_lik); fprintf(fid, '\n&end\n'); +%% S* (Latent Variables) + +% Check that two latent vars don't impact the same matrix +combine = {}; +mats = {'C', 'H', 'G', 'A', 'F', 'R'}; +for i=1:length(mats) + if sum(strcmp({options_.dmm.S.mat}, mats{i})) > 1 + idxs = strcmp({options_.dmm.S.mat}, mats{i}); + canLatentVarsBeCombiend(options_, idxs); + combine = [combine; {mats{i}, idxs}]; + end +end + +wroteLatVarFor = {}; +for i=1:size(options_.dmm.S, 2) + if ~any(strcmp(wroteLatVarFor(:), options_.dmm.S(i).mat)) + numStates = 1; + if any(strcmp(combine(:,1), options_.dmm.S(i).mat)) + for j=1:size(options_.dmm.S, 2) + if any(strcmp(combine(:,1), options_.dmm.S(i).mat)) + numStates = numStates*options_.dmm.S(i).ns; + end + end + else + numStates = options_.dmm.S(i).ns; + end + + multidx = find(strcmp({options_.multinomial(:).process}, options_.dmm.S(i).process)); + tpidx = find(strcmp(estimation_info.transition_probability_index, options_.multinomial(multidx).probability)); + params = estimation_info.transition_probability(tpidx).prior.params; + + fprintf(fid, '\n&S%d\n', i); + fprintf(fid, 'dynS%d=''%s'' nS%d=%d hypS%d(1,1)=%s matS%d=''%s''',i,'I',i, ... + numStates, i, num2str(params), i, options_.dmm.S(i).mat); + fprintf(fid, '\n&end\n'); + wroteLatVarFor = [wroteLatVarFor options_.dmm.S(i).mat]; + end +end + +%% SSM +fprintf(fid, '\n&ssm\n'); +fprintf(fid, 'nu=%d nv=%d nx=%d d=%d %d dllname=''%s'' check=''%s''', M_.exo_nbr, ... + length(wroteLatVarFor), options_.dmm.nx, ... + options_.dmm.max_order_of_integration, options_.dmm.num_nonstationary, ... + [cd filesep M_.fname '_dmm.m'], options_.dmm.check_mats); +fprintf(fid, '\n&end\n'); + %% Dataset fprintf(fid, '\n&dataset\n'); data = options_.dmm.dataset; @@ -100,44 +139,7 @@ for i=1:size(data,1) end fprintf(fid, '&end\n'); -% Check that two latent vars don't impact the same matrix -if sum(strcmp({options_.dmm.S.mat}, 'C')) > 1 - canLatentVarsBeCombiend(options_, strcmp({options_.dmm.S.mat}, 'C')); -end - -if sum(strcmp({options_.dmm.S.mat}, 'H')) > 1 - canLatentVarsBeCombiend(options_, strcmp({options_.dmm.S.mat}, 'H')); -end - -if sum(strcmp({options_.dmm.S.mat}, 'G')) > 1 - canLatentVarsBeCombiend(options_, strcmp({options_.dmm.S.mat}, 'G')); -end - -if sum(strcmp({options_.dmm.S.mat}, 'A')) > 1 - canLatentVarsBeCombiend(options_, strcmp({options_.dmm.S.mat}, 'A')); -end - -if sum(strcmp({options_.dmm.S.mat}, 'F')) > 1 - canLatentVarsBeCombiend(options_, strcmp({options_.dmm.S.mat}, 'F')); -end - -if sum(strcmp({options_.dmm.S.mat}, 'R')) > 1 - canLatentVarsBeCombiend(options_, strcmp({options_.dmm.S.mat}, 'R')); -end - -%% S* -for i=1:size(options_.dmm.S, 2) - fprintf(fid, '\n&S%d\n', i); - - multidx = find(strcmp({options_.multinomial(:).process}, options_.dmm.S(i).process)); - tpidx = find(strcmp(estimation_info.transition_probability_index, options_.multinomial(multidx).probability)); - params = estimation_info.transition_probability(tpidx).prior.params; - - fprintf(fid, 'dynS%d=''%s'' nS%d=%d hypS%d(1,1)=%d %d matS%d=''%s''',i,'I',i, ... - options_.dmm.S(i).ns, i, params, i, options_.dmm.S(i).mat); - fprintf(fid, '\n&end\n'); -end - +%% Close file fclose(fid); end -- GitLab