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