73 lines
2.1 KiB
Matlab
73 lines
2.1 KiB
Matlab
function wh = submit_handle(funcHandle, wh, options)
|
|
|
|
arguments
|
|
funcHandle
|
|
wh
|
|
options.parallel = 1;
|
|
end
|
|
|
|
%%% 2) SUBMIT SIMULATION
|
|
% Initialize job results
|
|
if options.parallel
|
|
curpool = gcp('nocreate');
|
|
if isempty(curpool)
|
|
parpool;
|
|
else
|
|
% stop all forgotten or unfetched jobs from queue
|
|
if ~isempty(curpool.FevalQueue.QueuedFutures) || ~isempty(curpool.FevalQueue.RunningFutures)
|
|
oldq = length(curpool.FevalQueue.QueuedFutures) + length(curpool.FevalQueue.RunningFutures);
|
|
curpool.FevalQueue.cancelAll
|
|
fprintf('Canceled %d unfetched jobs from old queue.', oldq);
|
|
end
|
|
end
|
|
results = parallel.FevalFuture.empty();
|
|
else
|
|
results = [];
|
|
end
|
|
|
|
fprintf('Requested %d loops\n', wh.getLastLinIndice);
|
|
|
|
for lin_idx = 1:wh.getLastLinIndice
|
|
optionalVars = struct();
|
|
|
|
if ~isempty(wh.getDimension)
|
|
% Build the optionalVars struct
|
|
[parametervalues, parameternames] = wh.getPhysIndicesByLinIndex(lin_idx);
|
|
for pidx = 1:numel(parameternames)
|
|
optionalVars.(parameternames{pidx}) = parametervalues{pidx};
|
|
end
|
|
end
|
|
|
|
%%% SIMULATION HERE
|
|
if options.parallel
|
|
numOutputs = 1;
|
|
results(lin_idx) = parfeval(funcHandle, numOutputs, optionalVars);
|
|
else
|
|
finalresults{lin_idx} = feval(funcHandle, optionalVars);
|
|
wh.addValueToStorageByLinIdx(finalresults{lin_idx}, 'ber', lin_idx);
|
|
end
|
|
end
|
|
|
|
if options.parallel
|
|
%%% 4) Setup waitbar
|
|
h = waitbar(0, 'Processing Simulations...');
|
|
updateWaitbar = @(~) waitbar(mean(arrayfun(@(f) strcmp(f.State, 'finished'), results)), h);
|
|
|
|
fprintf('Fetching results... \n');
|
|
|
|
updateWaitbarFutures = afterEach(results, updateWaitbar, 0);
|
|
afterAll(updateWaitbarFutures, @(~) delete(h), 0);
|
|
|
|
%%% 7) Fetch final results iteratively as they finish
|
|
for i = 1:length(results)
|
|
try
|
|
[ridx, result] = fetchNext(results);
|
|
wh.addValueToStorageByLinIdx(result, 'ber', ridx);
|
|
catch ME
|
|
fprintf('A job failed or could not be fetched. Error: %s\n', ME.message);
|
|
end
|
|
end
|
|
end
|
|
|
|
end
|