patternMinor
Running a simulation for all unique combinations of a range of parameters
Viewed 0 times
uniquesimulationallcombinationsrangerunningforparameters
Problem
I have written a script which is supposed to call the function at the bottom for each unique combination of values in the parameter vectors. That function is a simulation which I intend to run over all the unique combinations of those parameters. The simulation is run on a cluster, and the
Currently, my solution is to build a matrix with each row corresponding to a unique set of parameters. Then the
The following is the code that I am using, which works:
`% getting sim_ind from env
AI = getenv('PBS_ARRAYID');
sim_ind = str2num(AI);
time_slots = 40000;
% parameter vectors
up_down_ratio_arr = [1];
traffic_load_arr = [ 0.01, 0.05, 0.1, 0.5, 1, 2, 5, 10, 100, Inf ];
blocked_modes_ind_arr = [1 2 3];
traffic_model_arr = [1 2];
% total number of unique combinations
uniq = length(up_down_ratio_arr) length(traffic_load_arr) length(blocked_modes_ind_arr) * length(traffic_model_arr);
parameters = zeros(uniq, 4);
% propagating the parameter list matrix
counter = 0;
for i = up_down_ratio_arr
for j = traffic_load_arr
for k = blocked_modes_ind_arr
for l = traffic_model_arr
counter = counter + 1;
parameters(counter, 1) = i;
parameters(counter, 2) = j;
parameters(counter, 3) = k;
parameters(counter, 4) = l;
end
end
end
end
% wrapping the sim_ind
ind = mod(sim_ind, uniq);
% mod maps all multiples of the largest index to zero
if ind == 0
ind = uniq;
end
% retrieving a parameter set
up_down_ratio = parameters(ind,1);
traffic_load = parameters(ind,2);
blocked_modes_ind = parameters(ind,3);
traffic_model = parameters(ind,4);
% call the routine
MainCode_Single_Backahul_Cell_Sch(time_slots, up_down_ratio, traffic_load, blocked_mod
sim_ind for each of these jobs is pulled from the environment.Currently, my solution is to build a matrix with each row corresponding to a unique set of parameters. Then the
sim_ind value (passed from the environment) is used to determine which unique set of parameters will be used in that iteration by indexing the matrix.The following is the code that I am using, which works:
`% getting sim_ind from env
AI = getenv('PBS_ARRAYID');
sim_ind = str2num(AI);
time_slots = 40000;
% parameter vectors
up_down_ratio_arr = [1];
traffic_load_arr = [ 0.01, 0.05, 0.1, 0.5, 1, 2, 5, 10, 100, Inf ];
blocked_modes_ind_arr = [1 2 3];
traffic_model_arr = [1 2];
% total number of unique combinations
uniq = length(up_down_ratio_arr) length(traffic_load_arr) length(blocked_modes_ind_arr) * length(traffic_model_arr);
parameters = zeros(uniq, 4);
% propagating the parameter list matrix
counter = 0;
for i = up_down_ratio_arr
for j = traffic_load_arr
for k = blocked_modes_ind_arr
for l = traffic_model_arr
counter = counter + 1;
parameters(counter, 1) = i;
parameters(counter, 2) = j;
parameters(counter, 3) = k;
parameters(counter, 4) = l;
end
end
end
end
% wrapping the sim_ind
ind = mod(sim_ind, uniq);
% mod maps all multiples of the largest index to zero
if ind == 0
ind = uniq;
end
% retrieving a parameter set
up_down_ratio = parameters(ind,1);
traffic_load = parameters(ind,2);
blocked_modes_ind = parameters(ind,3);
traffic_model = parameters(ind,4);
% call the routine
MainCode_Single_Backahul_Cell_Sch(time_slots, up_down_ratio, traffic_load, blocked_mod
Solution
For a full factorial experiment, you may want to avoid constructing the whole matrix just to get the factor levels for a single experiment, especially if you have a large number of factors and levels and you are using a language where loops are not very efficient. Here is how you can do it using
In a single factor experiment, you run the experiment over the range of values of the first factor. This is easy to do using
if you want to start at one (since MATLAB indexes arrays from 1).
To extend the experiment to a second factor, you want this new factor to have its first level value for the first
You'll use
if you want to start from 1.
You can continue this procedure to extend your experiment to any number of factors. Just make the divisor inside the
Here's what it might look like for your example:
mod.In a single factor experiment, you run the experiment over the range of values of the first factor. This is easy to do using
mod: use mod(sim_ind, nlevels_factor1), or mod(sim_ind-1, nlevels_factor1) + 1if you want to start at one (since MATLAB indexes arrays from 1).
To extend the experiment to a second factor, you want this new factor to have its first level value for the first
nlevels_factor1 runs, then its second level value for the second nlevels_factor1 runs, etc... all the way up till the nlevels_factor1*nlevels_factor2th run. You'll use
mod again, but now you want the first argument to mod to be 1 for the first nlevels_factor1 runs, 2 for the next nlevels_factor1 runs, etc. So instead of passing the sim_index (or sim_index-1) to mod, you'll pass ceil(sim_index/nlevels_factor1), which has value 1 for the first nlevels_factor1 runs, 2 for the next nlevels_factor1 runs, etc. Your factor level for the second factor will be mod(ceil(sim_index/nlevels_factor1) - 1, nlevels_factor2) + 1if you want to start from 1.
You can continue this procedure to extend your experiment to any number of factors. Just make the divisor inside the
ceil equal to the product of the number of levels of all of the previous factors. Here's what it might look like for your example:
% getting sim_ind from env
AI = getenv('PBS_ARRAYID');
sim_ind = str2num(AI);
time_slots = 40000;
% parameter vectors
up_down_ratio_arr = [1];
traffic_load_arr = [ 0.01, 0.05, 0.1, 0.5, 1, 2, 5, 10, 100, Inf ];
blocked_modes_ind_arr = [1 2 3];
traffic_model_arr = [1 2];
size_up_down_ratio = length(up_down_ratio_arr);
size_traffic_load = length(traffic_load_arr);
size_blocked_modes = length(blocked_modes_ind_arr);
size_traffic_model = length(traffic_model_arr);
% total number of unique combinations
uniq = size_up_down_ratiosize_traffic_loadsize_blocked_modes*size_traffic_model;
% repeat each value once: 1,2,3,4,5,6,7,8,9,10,1,2,3,4...
i_up_down_ratio = mod(sim_ind - 1,size_up_down_ratio) + 1;
% repeat each value size_so_far times:
% 1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3...
size_so_far = size_up_down_ratio;
i_traffic_load = mod(ceil(sim_ind/size_so_far) - 1, size_traffic_load) + 1;
size_so_far = size_so_far*size_traffic_load;
i_blocked_modes = mod(ceil(sim_ind/size_so_far) - 1, size_blocked_modes) + 1;
size_so_far = size_so_far*size_blocked_modes;
i_traffic_model = mod(ceil(sim_ind/size_so_far) - 1, size_traffic_model) + 1;
up_down_ratio = up_down_ratio_arr(i_up_down_ratio);
traffic_load = traffic_load_arr(i_traffic_load);
blocked_modes_ind = blocked_modes_ind_arr(i_blocked_modes);
traffic_model = traffic_model_arr(i_traffic_model);
% call the routine
MainCode_Single_Backahul_Cell_Sch(time_slots, up_down_ratio, traffic_load, blocked_modes_ind, traffic_model, ceil(sim_ind/uniq) );
Code Snippets
mod(sim_ind-1, nlevels_factor1) + 1mod(ceil(sim_index/nlevels_factor1) - 1, nlevels_factor2) + 1Context
StackExchange Code Review Q#137868, answer score: 8
Revisions (0)
No revisions yet.