From cbce704637160fab1c19e77c8864f75624bc57a3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Adjemian=20=28Argos=29?= <stepan@adjemian.eu> Date: Fri, 13 Sep 2024 11:35:06 +0200 Subject: [PATCH] Allow negative values for niter. If niter is negative, the number of iterations is abs(niter) but we report the total time of simulation instead of the average time (across iterations). This is useful if the benchmarked model is small (and the simulation time below one second). --- matlab/run_simulations.m | 55 ++++++++++++++++++++++------------------ run.sh | 38 ++++++++++++++++++++------- 2 files changed, 59 insertions(+), 34 deletions(-) diff --git a/matlab/run_simulations.m b/matlab/run_simulations.m index 7dad1d9..0de88ea 100644 --- a/matlab/run_simulations.m +++ b/matlab/run_simulations.m @@ -19,6 +19,12 @@ function run_simulations(model, stack_solve_algo, static_solve_algo, niter, ccri global oo_ +if niter==0 + error('Fourth argument (number of iterations) cannot be equal to zero.') +end + +weight = @(n) (n<0) + (n>0)*(1/n); + id = 1:length(stack_solve_algo); jd = 1:length(static_solve_algo); @@ -62,13 +68,13 @@ for algo = [0, 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); + dprintf('dynare %s onlyclearglobals -DITERATIONS=%u -DSTACK_SOLVE_ALGO_VALUE=%u', model, abs(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)); + info = dynare(sprintf('%s', model), 'onlyclearglobals', sprintf('-DITERATIONS=%u', abs(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; + Timings.MATLAB_computing(id(stack_solve_algo==algo), 1) = info.time.compute*weight(niter); else Timings.MATLAB_preprocessing(id(stack_solve_algo==algo), 1) = info.time.preprocessor; Timings.MATLAB_computing(id(stack_solve_algo==algo), 1) = -2; @@ -85,13 +91,13 @@ for algo = [0, 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 -DSTEADY_SOLVE_ALGO_VALUE=%u', model, niter, algo, solver); + dprintf('dynare %s onlyclearglobals -DITERATIONS=%u -DSTACK_SOLVE_ALGO_VALUE=%u -DSTEADY_SOLVE_ALGO_VALUE=%u', model, abs(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)); + info = dynare(sprintf('%s', model), 'onlyclearglobals', sprintf('-DITERATIONS=%u', abs(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; + Timings.MATLAB_computing(id(stack_solve_algo==algo), jd(solver==static_solve_algo)) = info.time.compute*weight(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; @@ -118,13 +124,13 @@ for algo = [0, 1] 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); + dprintf('dynare %s onlyclearglobals fast -DUSE_DLL=true -DITERATIONS=%u -DSTACK_SOLVE_ALGO_VALUE=%u', model, abs(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)); + info = dynare(sprintf('%s', model), 'onlyclearglobals', 'fast', '-DUSE_DLL=true', sprintf('-DITERATIONS=%u', abs(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; + Timings.USE_DLL_computing(id(stack_solve_algo==algo), 1) = info.time.compute*weight(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; @@ -140,13 +146,13 @@ for algo = [0, 1] 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); + dprintf('dynare %s onlyclearglobals fast -DUSE_DLL=true -DITERATIONS=%u -DSTACK_SOLVE_ALGO_VALUE=%u -DSTEADY_SOLVE_ALGO_VALUE=%u', model, abs(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)); + info = dynare(sprintf('%s', model), 'onlyclearglobals', 'fast', '-DUSE_DLL=true', sprintf('-DITERATIONS=%u', abs(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; + Timings.USE_DLL_computing(id(stack_solve_algo==algo), jd(solver==static_solve_algo)) = info.time.compute*weight(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; @@ -172,13 +178,13 @@ 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); + dprintf('dynare %s onlyclearglobals -DBYTECODE=true -DITERATIONS=%u -DSTACK_SOLVE_ALGO_VALUE=%u', model, abs(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)); + info = dynare(sprintf('%s', model), 'onlyclearglobals', sprintf('-DITERATIONS=%u', abs(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; + Timings.BYTECODE_computing(id(stack_solve_algo==algo), 1) = info.time.compute*weight(niter); else Timings.BYTECODE_preprocessing(id(stack_solve_algo==algo), 1) = info.time.preprocessor; Timings.BYTECODE_computing(id(stack_solve_algo==algo), 1) = -2; @@ -198,13 +204,13 @@ for mfs = 0:3 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); + dprintf('dynare %s onlyclearglobals -DITERATIONS=%u -DSTACK_SOLVE_ALGO_VALUE=%u -DMFS_VALUE=%u -DBLOCKS=true', model, abs(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)); + info = dynare(sprintf('%s', model), 'onlyclearglobals', sprintf('-DITERATIONS=%u', abs(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; + Timings.MATLAB_WITH_BLOCKS_computing(id(stack_solve_algo==algo), mfs+1) = info.time.compute*weight(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; @@ -225,13 +231,13 @@ for mfs = 0:3 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); + dprintf('dynare %s onlyclearglobals fast -DUSE_DLL=true -DITERATIONS=%u -DSTACK_SOLVE_ALGO_VALUE=%u -DMFS_VALUE=%u -DBLOCKS=true', model, abs(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)); + info = dynare(sprintf('%s', model), 'onlyclearglobals', 'fast', sprintf('-DITERATIONS=%u', abs(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; + Timings.USE_DLL_WITH_BLOCKS_computing(id(stack_solve_algo==algo), mfs+1) = info.time.compute*weight(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; @@ -254,13 +260,13 @@ for mfs = 0:3 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); + dprintf('dynare %s onlyclearglobals -DBYTECODE=true -DITERATIONS=%u -DSTACK_SOLVE_ALGO_VALUE=%u -DMFS_VALUE=%u -DBLOCKS=true', model, abs(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)); + info = dynare(sprintf('%s', model), 'onlyclearglobals', sprintf('-DITERATIONS=%u', abs(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; + Timings.BYTECODE_WITH_BLOCKS_computing(id(stack_solve_algo==algo), mfs+1) = info.time.compute*weight(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; @@ -278,7 +284,6 @@ end % system(sprintf('touch %s-done.info', model)) - function disp_title(txt) len = length(txt); skipline() diff --git a/run.sh b/run.sh index 4b15246..1188619 100755 --- a/run.sh +++ b/run.sh @@ -1,16 +1,36 @@ -#!/usr/bin/bash +#!/usr/bin/env bash -while [ ! -f m10-done.info ] -do - matlab -batch "MODELS=1; compute_transition;" |& tee -a m10-all.log -done +SCRIPT=$(realpath "$0") +SCRIPTPATH=$(dirname "$SCRIPT") +echo "$SCRIPTPATH" + +if [ $# -eq 0 ] +then + echo "The name of one model at least is required." +else + if [ $# -eq 1 ] + then + echo "I will run perfect foresight simulations with 1 model:" + else + echo "I will run perfect foresight simulations with $# models:" + fi +fi -while [ ! -f m20-done.info ] +for model in "$@" do - matlab -batch "MODELS=2; compute_transition;" |& tee -a m20-all.log + printf " \u25A1 $model\n" done -while [ ! -f m30-done.info ] +for model in "$@" do - matlab -batch "MODELS=3; compute_transition;" |& tee -a m30-all.log + if [ ! -f $model-done.info ] + then + while [ ! -f $model-done.info ] + do + matlab -batch "addpath $MATLAB_PATH; MODEL='$model'; compute_all_transitions;" |& tee -a $model-all.log + done + printf " \u2714 $model\n" + else + printf " \u2714 $model (already done)\n" + fi done -- GitLab