Skip to content
Snippets Groups Projects
Commit 0eacf716 authored by Stéphane Adjemian's avatar Stéphane Adjemian
Browse files

Code factorization.

parent 7b68ba77
No related branches found
No related tags found
No related merge requests found
function run_simulations(model, stack_solve_algo, static_solve_algo, niter, ccrit)
% INPUTS
% - model [char] 1×n array, name of the mod file (without extension).
% - stack_solve_algo [integer] 1×p array, identifiers for the solver of the stack model.
% - static_solve_algo [integer] 1×q array, identifiers for the solver of the static model (only used with stack_solve_algo==7)
% - niter [integer] scalar, number of simulation of each configuration.
% - ccrit [double] scalar, precision threshold.
%
% OUTPUTS
% None
% Copyright © 2024 Dynare Team
id = 1:length(stack_solve_algo);
jd = 1:length(static_solve_algo);
%
% Initialise the arrys storing the timings
%
Timings = matfile(sprintf('simulations-%s.mat', model));
if exist(sprintf('simulations-%s.mat', model), 'file')
Timings.Properties.Writable = true;
end
if ~ismember('MATLAB_computing', {whos(Timings).name})
Timings.MATLAB_preprocessing = NaN(length(stack_solve_algo), length(static_solve_algo));
Timings.MATLAB_computing = NaN(length(stack_solve_algo), length(static_solve_algo));
end
if ~ismember('USE_DLL_computing', {whos(Timings).name})
Timings.USE_DLL_preprocessing = NaN(length(stack_solve_algo), length(static_solve_algo));
Timings.USE_DLL_computing = NaN(length(stack_solve_algo), length(static_solve_algo));
end
if ~ismember('BYTECODE_computing', {whos(Timings).name})
Timings.BYTECODE_preprocessing = NaN(length(stack_solve_algo), 1);
Timings.BYTECODE_computing = NaN(length(stack_solve_algo), 1);
end
if ~ismember('MATLAB_WITH_BLOCKS_computing', {whos(Timings).name})
Timings.MATLAB_WITH_BLOCKS_preprocessing = NaN(length(stack_solve_algo), 4);
Timings.MATLAB_WITH_BLOCKS_computing = NaN(length(stack_solve_algo), 4);
end
if ~ismember('USE_DLL_WITH_BLOCKS_computing', {whos(Timings).name})
Timings.USE_DLL_WITH_BLOCKS_preprocessing = NaN(length(stack_solve_algo), 4);
Timings.USE_DLL_WITH_BLOCKS_computing = NaN(length(stack_solve_algo), 4);
end
if ~ismember('BYTECODE_WITH_BLOCKS_computing', {whos(Timings).name})
Timings.BYTECODE_WITH_BLOCKS_preprocessing = NaN(length(stack_solve_algo), 4);
Timings.BYTECODE_WITH_BLOCKS_computing = NaN(length(stack_solve_algo), 4);
end
%
% Matlab
%
for algo = [0, 1]
if algo<7
if isnan(Timings.MATLAB_computing(id(stack_solve_algo==algo), 1))
% Try to simulate the model if this configuration has not been tried before (with or without success).
try
disp_title(sprintf('| MATLAB (solve_algo=%u, no blocks, model=%s) |', algo, model));
dprintf('dynare %s onlyclearglobals -DITERATIONS=%u -DSTACK_SOLVE_ALGO_VALUE=%u', model, niter, algo);
skipline()
Timings.MATLAB_computing(id(stack_solve_algo==algo), 1) = -3; % Provision for MATLAB crash
info = dynare(sprintf('%s', model), 'onlyclearglobals', sprintf('-DITERATIONS=%u', niter), sprintf('-DSTACK_SOLVE_ALGO_VALUE=%u', algo));
if oo_.deterministic_simulation.error<ccrit
Timings.MATLAB_preprocessing(id(stack_solve_algo==algo), 1) = info.time.preprocessor;
Timings.MATLAB_computing(id(stack_solve_algo==algo), 1) = info.time.compute/niter;
else
Timings.MATLAB_preprocessing(id(stack_solve_algo==algo), 1) = info.time.preprocessor;
Timings.MATLAB_computing(id(stack_solve_algo==algo), 1) = -2;
end
catch E
fprintf(1, 'Simulation failed:\n\n%s', E.message);
Timings.MATLAB_preprocessing(id(stack_solve_algo==algo), 1) = info.time.preprocessor;
Timings.MATLAB_computing(id(stack_solve_algo==algo), 1) = -1;
end
end
else
for solver = static_solve_algo
if isnan(Timings.MATLAB_computing(id(stack_solve_algo==algo), jd(solver==static_solve_algo)))
% Try to simulate the model if this configuration has not been tried before (with or without success).
try
disp_title(sprintf('| MATLAB (solve_algo=%u, no blocks, model=%s) |', algo, model));
dprintf('dynare %s onlyclearglobals -DITERATIONS=%u -DSTACK_SOLVE_ALGO_VALUE=%u -DSTEADY_SOLVE_ALGO_VALUE=%u', model, niter, algo, solver);
skipline()
Timings.MATLAB_computing(id(stack_solve_algo==algo), jd(solver==static_solve_algo)) = -3; % Provision for MATLAB crash
info = dynare(sprintf('%s', model), 'onlyclearglobals', sprintf('-DITERATIONS=%u', niter), sprintf('-DSTACK_SOLVE_ALGO_VALUE=%u', algo), sprintf('-DSTEADY_SOLVE_ALGO_VALUE=%u', solver));
if oo_.deterministic_simulation.error<ccrit
Timings.MATLAB_preprocessing(id(stack_solve_algo==algo), jd(solver==static_solve_algo)) = info.time.preprocessor;
Timings.MATLAB_computing(id(stack_solve_algo==algo), jd(solver==static_solve_algo)) = info.time.compute/niter;
else
Timings.MATLAB_preprocessing(id(stack_solve_algo==algo), jd(solver==static_solve_algo)) = info.time.preprocessor;
Timings.MATLAB_computing(id(stack_solve_algo==algo), jd(solver==static_solve_algo)) = -2;
end
catch E
fprintf(1, 'Simulation failed:\n\n%s', E.message);
Timings.MATLAB_preprocessing(id(stack_solve_algo==algo), jd(solver==static_solve_algo)) = info.time.preprocessor;
Timings.MATLAB_computing(id(stack_solve_algo==algo), jd(solver==static_solve_algo)) = -1;
end
end
end
end
end
for algo = [2, 3, 4, 5]
% These algorithms are not available
Timings.MATLAB_preprocessing(id(stack_solve_algo==algo), 1) = -10;
Timings.MATLAB_computing(id(stack_solve_algo==algo), 1) = -10;
end
%
% use_dll
%
for algo = [0, 1]
if algo<7
try
if isnan(Timings.USE_DLL_computing(id(stack_solve_algo==algo), 1))
disp_title(sprintf('| USE_DLL (solve_algo=%u, no blocks, model=%s) |', algo, model));
dprintf('dynare %s onlyclearglobals fast -DUSE_DLL=true -DITERATIONS=%u -DSTACK_SOLVE_ALGO_VALUE=%u', model, niter, algo);
skipline()
Timings.USE_DLL_computing(id(stack_solve_algo==algo), 1) = -3; % Provision for MATLAB crash
info = dynare(sprintf('%s', model), 'onlyclearglobals', 'fast', '-DUSE_DLL=true', sprintf('-DITERATIONS=%u', niter), sprintf('-DSTACK_SOLVE_ALGO_VALUE=%u', algo));
if oo_.deterministic_simulation.error<ccrit
Timings.USE_DLL_preprocessing(id(stack_solve_algo==algo), 1) = info.time.preprocessor;
Timings.USE_DLL_computing(id(stack_solve_algo==algo), 1) = info.time.compute/niter;
else
Timings.USE_DLL_preprocessing(id(stack_solve_algo==algo), 1) = info.time.preprocessor;
Timings.USE_DLL_computing(id(stack_solve_algo==algo), 1) = -2;
end
end
catch E
fprintf(1, 'Simulation failed:\n\n%s', E.message);
Timings.USE_DLL_preprocessing(id(stack_solve_algo==algo), 1) = info.time.preprocessor;
Timings.USE_DLL_computing(id(stack_solve_algo==algo), 1) = -1;
end
else
for solver = static_solve_algo
try
if isnan(Timings.USE_DLL_computing(id(stack_solve_algo==algo), jd(solver==static_solve_algo)))
disp_title(sprintf('| USE_DLL (solve_algo=%u, no blocks, model=%s) |', algo, model));
dprintf('dynare %s onlyclearglobals fast -DUSE_DLL=true -DITERATIONS=%u -DSTACK_SOLVE_ALGO_VALUE=%u -DSTEADY_SOLVE_ALGO_VALUE=%u', model, niter, algo, solver);
skipline()
Timings.USE_DLL_computing(id(stack_solve_algo==algo), jd(solver==static_solve_algo)) = -3; % Provision for MATLAB crash
info = dynare(sprintf('%s', model), 'onlyclearglobals', 'fast', '-DUSE_DLL=true', sprintf('-DITERATIONS=%u', niter), sprintf('-DSTACK_SOLVE_ALGO_VALUE=%u', algo), sprintf('-DSTEADY_SOLVE_ALGO_VALUE=%u', solver));
if oo_.deterministic_simulation.error<ccrit
Timings.USE_DLL_preprocessing(id(stack_solve_algo==algo), jd(solver==static_solve_algo)) = info.time.preprocessor;
Timings.USE_DLL_computing(id(stack_solve_algo==algo), jd(solver==static_solve_algo)) = info.time.compute/niter;
else
Timings.USE_DLL_preprocessing(id(stack_solve_algo==algo), jd(solver==static_solve_algo)) = info.time.preprocessor;
Timings.USE_DLL_computing(id(stack_solve_algo==algo), jd(solver==static_solve_algo)) = -2;
end
end
catch E
fprintf(1, 'Simulation failed:\n\n%s', E.message);
Timings.USE_DLL_preprocessing(id(stack_solve_algo==algo), jd(solver==static_solve_algo)) = info.time.preprocessor;
Timings.USE_DLL_computing(id(stack_solve_algo==algo), jd(solver==static_solve_algo)) = -1;
end
end
end
end
for algo = [2, 3, 4, 5]
% These algorithms are not available
Timings.USE_DLL_preprocessing(id(stack_solve_algo==algo), 1) = -10;
Timings.USE_DLL_computing(id(stack_solve_algo==algo), 1) = -10;
end
%
% Bytecode
%
for algo = [0, 1, 2, 3, 4, 5]
try
if isnan(Timings.BYTECODE_computing(id(stack_solve_algo==algo), 1))
disp_title(sprintf('| BYTECODE (solve_algo=%u, no blocks, model=%s) |', algo, model));
dprintf('dynare %s onlyclearglobals -DBYTECODE=true -DITERATIONS=%u -DSTACK_SOLVE_ALGO_VALUE=%u', model, niter, algo);
skipline()
Timings.BYTECODE_computing(id(stack_solve_algo==algo), 1) = -3; % Provision for MATLAB crash
info = dynare(sprintf('%s', model), 'onlyclearglobals', sprintf('-DITERATIONS=%u', niter), '-DBYTECODE=true', sprintf('-DSTACK_SOLVE_ALGO_VALUE=%u', algo));
if oo_.deterministic_simulation.error<ccrit
Timings.BYTECODE_preprocessing(id(stack_solve_algo==algo), 1) = info.time.preprocessor;
Timings.BYTECODE_computing(id(stack_solve_algo==algo), 1) = info.time.compute/niter;
else
Timings.BYTECODE_preprocessing(id(stack_solve_algo==algo), 1) = info.time.preprocessor;
Timings.BYTECODE_computing(id(stack_solve_algo==algo), 1) = -2;
end
end
catch E
fprintf(1, 'Simulation failed:\n\n%s', E.message);
Timings.BYTECODE_preprocessing(id(stack_solve_algo==algo), 1) = info.time.preprocessor;
Timings.BYTECODE_computing(id(stack_solve_algo==algo), 1) = -1;
end
end
%
% Matlab with blocks
%
for mfs = 0:3
for algo = [0, 1, 2, 3, 4]
if isnan(Timings.MATLAB_WITH_BLOCKS_computing(id(stack_solve_algo==algo), mfs+1))
try
disp_title(sprintf('| MATLAB (solve_algo=%u, with blocks, mfs=%u, model=%s) |', algo, mfs, model));
dprintf('dynare %s onlyclearglobals -DITERATIONS=%u -DSTACK_SOLVE_ALGO_VALUE=%u -DMFS_VALUE=%u -DBLOCKS=true', model, niter, algo, mfs);
skipline()
Timings.MATLAB_WITH_BLOCKS_computing(id(stack_solve_algo==algo), mfs+1) = -3; % Provision for MATLAB crash
info = dynare(sprintf('%s', model), 'onlyclearglobals', sprintf('-DITERATIONS=%u', niter), sprintf('-DMFS_VALUE=%u', mfs), '-DBLOCKS=true', sprintf('-DSTACK_SOLVE_ALGO_VALUE=%u', algo));
if oo_.deterministic_simulation.error<ccrit
Timings.MATLAB_WITH_BLOCKS_preprocessing(id(stack_solve_algo==algo), mfs+1) = info.time.preprocessor;
Timings.MATLAB_WITH_BLOCKS_computing(id(stack_solve_algo==algo), mfs+1) = info.time.compute/niter;
else
Timings.MATLAB_WITH_BLOCKS_preprocessing(id(stack_solve_algo==algo), mfs+1) = info.time.preprocessor;
Timings.MATLAB_WITH_BLOCKS_computing(id(stack_solve_algo==algo), mfs+1) = -2;
end
catch E
fprintf(1, 'Simulation failed:\n\n%s', E.message);
Timings.MATLAB_WITH_BLOCKS_preprocessing(id(stack_solve_algo==algo), mfs+1) = info.time.preprocessor;
Timings.MATLAB_WITH_BLOCKS_computing(id(stack_solve_algo==algo), mfs+1) = -1;
end
end
end
end
%
% USE_DLL with blocks
%
for mfs = 0:3
for algo = [0, 1, 2, 3, 4]
if isnan(Timings.USE_DLL_WITH_BLOCKS_computing(id(stack_solve_algo==algo), mfs+1))
try
disp_title(sprintf('| USE_DLL (solve_algo=%u, with blocks, mfs=%u, model=%s) |', algo, mfs, model));
dprintf('dynare %s onlyclearglobals fast -DUSE_DLL=true -DITERATIONS=%u -DSTACK_SOLVE_ALGO_VALUE=%u -DMFS_VALUE=%u -DBLOCKS=true', model, niter, algo, mfs);
skipline()
Timings.USE_DLL_WITH_BLOCKS_computing(id(stack_solve_algo==algo), mfs+1) = -3; % Provision for MATLAB crash
info = dynare(sprintf('%s', model), 'onlyclearglobals', 'fast', sprintf('-DITERATIONS=%u', niter), '-DBLOCKS=true', sprintf('-DMFS_VALUE=%u', mfs), '-DUSE_DLL=true', sprintf('-DSTACK_SOLVE_ALGO_VALUE=%u', algo));
if oo_.deterministic_simulation.error<ccrit
Timings.USE_DLL_WITH_BLOCKS_preprocessing(id(stack_solve_algo==algo), mfs+1) = info.time.preprocessor;
Timings.USE_DLL_WITH_BLOCKS_computing(id(stack_solve_algo==algo), mfs+1) = info.time.compute/niter;
else
Timings.USE_DLL_WITH_BLOCKS_preprocessing(id(stack_solve_algo==algo), mfs+1) = info.time.preprocessor;
Timings.USE_DLL_WITH_BLOCKS_computing(id(stack_solve_algo==algo), mfs+1) = -2;
end
catch E
fprintf(1, 'Simulation failed:\n\n%s', E.message);
Timings.USE_DLL_WITH_BLOCKS_preprocessing(id(stack_solve_algo==algo), mfs+1) = info.time.preprocessor;
Timings.USE_DLL_WITH_BLOCKS_computing(id(stack_solve_algo==algo), mfs+1) = -1;
end
end
end
system(sprintf('rm -rf %s', model));
system(sprintf('rm -rf +%s', model));
end
%
% Bytecode with blocks
%
for mfs = 0:3
for algo = [0, 1, 2, 3, 4, 5]
if isnan(Timings.BYTECODE_WITH_BLOCKS_computing(id(stack_solve_algo==algo), mfs+1))
try
disp_title(sprintf('| BYTECODE (solve_algo=%u, with blocks, mfs=%u, model=%s) |', algo, mfs, model));
dprintf('dynare %s onlyclearglobals -DBYTECODE=true -DITERATIONS=%u -DSTACK_SOLVE_ALGO_VALUE=%u -DMFS_VALUE=%u -DBLOCKS=true', model, niter, algo, mfs);
skipline()
Timings.BYTECODE_WITH_BLOCKS_computing(id(stack_solve_algo==algo), mfs+1) = -3; % Provision for MATLAB crash
info = dynare(sprintf('%s', model), 'onlyclearglobals', sprintf('-DITERATIONS=%u', niter), '-DBLOCKS=true', sprintf('-DMFS_VALUE=%u', mfs), '-DBYTECODE=true', sprintf('-DSTACK_SOLVE_ALGO_VALUE=%u', algo));
if oo_.deterministic_simulation.error<ccrit
Timings.BYTECODE_WITH_BLOCKS_preprocessing(id(stack_solve_algo==algo), mfs+1) = info.time.preprocessor;
Timings.BYTECODE_WITH_BLOCKS_computing(id(stack_solve_algo==algo), mfs+1) = info.time.compute/niter;
else
Timings.BYTECODE_WITH_BLOCKS_preprocessing(id(stack_solve_algo==algo), mfs+1) = info.time.preprocessor;
Timings.BYTECODE_WITH_BLOCKS_computing(id(stack_solve_algo==algo), mfs+1) = -2;
end
catch E
fprintf(1, 'Simulation failed:\n\n%s', E.message);
Timings.BYTECODE_WITH_BLOCKS_preprocessing(id(stack_solve_algo==algo), mfs+1) = info.time.preprocessor;
Timings.BYTECODE_WITH_BLOCKS_computing(id(stack_solve_algo==algo), mfs+1) = -1;
end
end
end
end
%
% Touch a file if everything is done.
%
system(sprintf('touch %s-done.info', model))
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment