Skip to content
Permalink
Browse files
Add files via upload
  • Loading branch information
dungranij committed Jul 5, 2021
1 parent 754a0ca commit bfaec3bb596c2f541bae6364aa620a6082b43d15
Show file tree
Hide file tree
Showing 4 changed files with 217 additions and 0 deletions.
@@ -0,0 +1,157 @@
% <strong>ParforProgMon</strong> - CLASS Progress monitor for `parfor` loops
%
% <strong>Usage</strong>
% Begin by creating a parallel pool.
%
% Then construct a <a href="matlab:help ParforProgMon">ParforProgMon</a> object:
% ppm = <a href="matlab:help ParforProgMon">ParforProgMon</a>(strWindowTitle, nNumIterations <, nProgressStepSize, nWidth, nHeight, nMinIterations>);
%
% 'strWindowTitle' is a string containing the title of the progress bar
% window. 'nNumIterations' is an integer with the total number of
% iterations in the loop.
%
% <strong>Optional arguments</strong> 'nProgressStepSize' specifies how
% many loop iterations should correspond to a single call to 'increment()'.
% 'nWidth' and 'nHeight' specify the size of the progress window.
%
% <strong>Within the parfor loop</strong>
% parfor (nIndex = 1:nNumIterations)
% if (mod(nIndex, nProgressStepSize) == 0)
% ppm.increment();
% end
% end
%
% Modified from <a href="https://www.mathworks.com/matlabcentral/fileexchange/31673-parfor-progress-monitor-v2">ParforProgMonv2</a>.

classdef ParforProgMon < handle

properties ( GetAccess = private, SetAccess = private )
Port
HostName
strAttachedFilesFolder
end

properties (Transient, GetAccess = private, SetAccess = private)
JavaBit
end

methods ( Static )
function o = loadobj( X )
% loadobj - METHOD REconstruct a ParforProgMon object

% Once we've been loaded, we need to reconstruct ourselves correctly as a
% worker-side object.
% fprintf('Worker: Starting with {%s, %f, %s}\n', X.HostName, X.Port, X.strAttachedFilesFolder);
o = ParforProgMon( {X.HostName, X.Port, X.strAttachedFilesFolder} );
end
end

methods
function o = ParforProgMon(strWindowTitle, nNumIterations, nProgressStepSize, nWidth, nHeight, nMinIterations)
% ParforProgMon - CONSTRUCTOR Create a ParforProgMon object
%
% Usage: ppm = ParforProgMon(strWindowTitle, nNumIterations <, nProgressStepSize, nWidth, nHeight>)
%
% 'strWindowTitle' is a string containing the title of the
% progress bar window. 'nNumIterations' is an integer with the
% total number of iterations in the loop. 'nProgressStepSize'
% indicates that one update (call to 'increment') corresponds to
% this many iterations. 'nWidth' indicates the width of the
% progress window. 'nHeight' indicates the width of the progress
% window.

if (~exist('nMinIterations', 'var') || isempty(nMinIterations))
nMinIterations = 0;
end

% - Are we a worker or a server?
if ((nargin == 1) && iscell(strWindowTitle))
% - Worker constructor
% Get attached files
o.strAttachedFilesFolder = getAttachedFilesFolder(strWindowTitle{3});
% fprintf('Worker: Attached files folder on worker is [%s]\n', o.strAttachedFilesFolder);

% Add to java path
w = warning('off', 'MATLAB:Java:DuplicateClass');
javaaddpath(o.strAttachedFilesFolder);
warning(w);

% "Private" constructor used on the workers
o.JavaBit = ParforProgressMonitor.createWorker(strWindowTitle{1}, strWindowTitle{2});
o.Port = [];

elseif (nargin > 1) && (nNumIterations >= nMinIterations)
% - Server constructor
% Check arguments
if (~exist('nProgressStepSize', 'var') || isempty(nProgressStepSize))
nProgressStepSize = 1;
end

if (~exist('nWidth', 'var') || ~exist('nHeight', 'var') || isempty(nHeight) || isempty(nWidth))
nWidth = 400;
nHeight = 80;
end

% Check for an existing pool
pPool = gcp('nocreate');
if (isempty(pPool))
error('ParforProgMon:NeedPool', ...
'*** ParforProgMon: You must construct a pool before creating a ParforProgMon object.');
end

% Amend java path
strPath = fileparts(which('ParforProgMon'));
o.strAttachedFilesFolder = fullfile(strPath, 'java');
% fprintf('Server: JAVA class folder is [%s]\n', o.strAttachedFilesFolder);
w = warning('off', 'MATLAB:Java:DuplicateClass');
javaaddpath(o.strAttachedFilesFolder);
warning(w);

% Distribute class to pool
if (ismember(pPool.AttachedFiles, o.strAttachedFilesFolder))
pPool.updateAttachedFiles();
else
pPool.addAttachedFiles(o.strAttachedFilesFolder);
end

% Normal construction
o.JavaBit = ParforProgressMonitor.createServer( strWindowTitle, nNumIterations, nProgressStepSize, nWidth, nHeight );
o.Port = double( o.JavaBit.getPort() );
% Get the client host name from pctconfig
cfg = pctconfig;
o.HostName = cfg.hostname;
end
end

function X = saveobj( o )
% saveobj - METHOD Save a ParforProgMon object for serialisations

% Only keep the Port, HostName and strAttachedFilesFolder
X.Port = o.Port;
X.HostName = o.HostName;
X.strAttachedFilesFolder = o.strAttachedFilesFolder;
end

function increment( o )
% increment - METHOD Indicate that a single loop execution has finished

% Update the UI
if (~isempty(o.JavaBit))
o.JavaBit.increment();
end
end

function delete( o )
% delete - METHOD Delete a ParforProgMon object

% - Make sure that any other threads that may have closed
% the UI down have a chance to do it first
pause(.01);

% Close the UI
if (~isempty(o.JavaBit))
o.JavaBit.done();
end
end
end
end
@@ -0,0 +1,31 @@
# Parfor progress monitor
<img align="right" src="https://github.com/DylanMuir/ParforProgMon/raw/master/progress_bar.png" />

## A Java-based `Matlab` class for progress monitoring during a `parfor` loop

### Usage
Begin by creating a parallel pool.

Then construct a ParforProgMon object:

ppm = ParforProgMon(strWindowTitle, nNumIterations <, nProgressStepSize, nWidth, nHeight>);

`strWindowTitle` is a string containing the title of the progress bar
window. `nNumIterations` is an integer with the total number of
iterations in the loop.

#### Optional arguments
`nProgressStepSize` specifies to update the progress bar every time this
number of steps passes. `nWidth` and `nHeight` specify the size of the
progress window.

Within the `parfor` loop:

parfor (nIndex = 1:nNumIterations)
ppm.increment();
end

### Credits
[Parfor Progress monitor](https://www.mathworks.com/matlabcentral/fileexchange/24594-parfor-progress-monitor)

[Parfor Progress monitor v2](https://www.mathworks.com/matlabcentral/fileexchange/31673-parfor-progress-monitor-v2)
@@ -0,0 +1,29 @@
Copyright (c) 2016, Dylan Muir
Copyright (c) 2011, Willem-Jan de Goeij
Copyright (c) 2009, The MathWorks, Inc.
All rights reserved.

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:

* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in
the documentation and/or other materials provided with the distribution
* Neither the name of the The MathWorks, Inc. nor the names
of its contributors may be used to endorse or promote products derived
from this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
BIN +15.6 KB progress_bar.png
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.

0 comments on commit bfaec3b

Please sign in to comment.