diff --git a/matlab/run_simulations.m b/matlab/run_simulations.m
index 7dad1d92807fe19ada8b4b295c1a9ef3bfac804f..0de88ea45eaa572929dbac47a80258dee14151e2 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 4b152467458c6d2d462204a523e27ba82d0179c6..1188619ece109def2a5a9b9f850ccdf7fafb7251 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