Home > voicebox > finishat.m

# finishat

## PURPOSE

FINISHAT print estimated finish time of a long computation (FRAC,TOL,FMT)

## SYNOPSIS

function [eta,etaf]=finishat(frac,tol,fmt)

## DESCRIPTION

FINISHAT print estimated finish time of a long computation (FRAC,TOL,FMT)
Usage:  (1)  for i=1:many
finishat((i-1)/many);  % initializes on first pass when i=1
... computation ...
end

(2)  for i=1:many
finishat([i-1 many]);  % alternative argument format
... computation ...
end

(3)  finishat(0);               % explicit initialization before loop
for i=1:many
... computation ...
finishat(i/many);      % calculate fraction completed
end

(4)  for i=1:NI
for j=1:NJ
for k=1:NK
finishat([i NI; j NJ; k-1 NK]); % one row per nested loop
... computation ...
end
end
end

Inputs: FRAC = fraction of total comutation that has been completed
Alternatively at start of inner loop: [i NI; j NJ; k-1 NK ...] where i, j, k are
loop indices and NI, NJ, NK their limits. Use k instead of k-1 if placed at
the end of the inner loop. As a special case, FRAC=0 initializes the routine.
TOL  = Tolerance in minutes. If the estimated time has changed by less
than this, then nothing will be printed. [default 10% of remaining time]
FMT  = Format string which should include %s for estimated finish time, %d for remaining minutes and %f for fraction complete

Output: ETA  = string containing the expected finish time
specifying this will suppress printing message to std err (fid=2)
ETAF = expected finish time as a daynumber

Example:       finishat(0);
for i=1:many
long computation;
finishat(i/many);
end

## CROSS-REFERENCE INFORMATION

This function calls:
This function is called by:

## SOURCE CODE

0001 function [eta,etaf]=finishat(frac,tol,fmt)
0002 %FINISHAT print estimated finish time of a long computation (FRAC,TOL,FMT)
0003 % Usage:  (1)  for i=1:many
0004 %                  finishat((i-1)/many);  % initializes on first pass when i=1
0005 %                  ... computation ...
0006 %              end
0007 %
0008 %         (2)  for i=1:many
0009 %                  finishat([i-1 many]);  % alternative argument format
0010 %                  ... computation ...
0011 %              end
0012 %
0013 %         (3)  finishat(0);               % explicit initialization before loop
0014 %              for i=1:many
0015 %                  ... computation ...
0016 %                  finishat(i/many);      % calculate fraction completed
0017 %              end
0018 %
0019 %         (4)  for i=1:NI
0020 %                  for j=1:NJ
0021 %                      for k=1:NK
0022 %                          finishat([i NI; j NJ; k-1 NK]); % one row per nested loop
0023 %                          ... computation ...
0024 %                      end
0025 %                  end
0026 %              end
0027 %
0028 % Inputs: FRAC = fraction of total comutation that has been completed
0029 %                Alternatively at start of inner loop: [i NI; j NJ; k-1 NK ...] where i, j, k are
0030 %                loop indices and NI, NJ, NK their limits. Use k instead of k-1 if placed at
0031 %                the end of the inner loop. As a special case, FRAC=0 initializes the routine.
0032 %         TOL  = Tolerance in minutes. If the estimated time has changed by less
0033 %                than this, then nothing will be printed. [default 10% of remaining time]
0034 %         FMT  = Format string which should include %s for estimated finish time, %d for remaining minutes and %f for fraction complete
0035 %
0036 % Output: ETA  = string containing the expected finish time
0037 %                specifying this will suppress printing message to std err (fid=2)
0038 %         ETAF = expected finish time as a daynumber
0039 %
0040 % Example:       finishat(0);
0041 %                for i=1:many
0042 %                    long computation;
0043 %                    finishat(i/many);
0044 %                end
0045
0046 %      Copyright (C) Mike Brookes 1998
0047 %      Version: \$Id: finishat.m 9559 2017-03-09 18:52:14Z dmb \$
0048 %
0049 %   VOICEBOX is a MATLAB toolbox for speech processing.
0051 %
0052 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
0053 %   This program is free software; you can redistribute it and/or modify
0055 %   the Free Software Foundation; either version 2 of the License, or
0056 %   (at your option) any later version.
0057 %
0058 %   This program is distributed in the hope that it will be useful,
0059 %   but WITHOUT ANY WARRANTY; without even the implied warranty of
0060 %   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
0061 %   GNU General Public License for more details.
0062 %
0063 %   You can obtain a copy of the GNU General Public License from
0064 %   http://www.gnu.org/copyleft/gpl.html or by writing to
0065 %   Free Software Foundation, Inc.,675 Mass Ave, Cambridge, MA 02139, USA.
0066 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
0067
0068 persistent oldt oldnw
0069 if nargin<3
0070     fmt='Estimated finish at %s (%.2f done, %d min remaining)\n';
0071
0072 end
0073 nf=size(frac,1);
0074 if all(frac(:,1)<=[ones(nf-1,1); 0]) % initialize if fraction done is <=0
0075     oldt=0;
0076     eta='Unknown';
0077     tic;
0078 else
0079     if size(frac,2)==2
0080         fp=cumprod(frac(:,2));
0081         frac=sum((frac(:,1)-1)./fp)+1/fp(end);
0082     end
0083     nw=now;                             % current time as serial number
0084     sectogo=(1/frac-1)*toc;      % seconds to go
0085     newt=nw+sectogo/86400;       % add estimated time in days
0086     if nargin<2 || ~numel(tol)
0087         tol=max(0.1*(newt-nw)*1440,1);
0088     end
0089     if ~exist('oldt','var') || oldt==0 || (abs(newt-oldt)>tol/1440 && (nw-oldnw)>10/86400) || (nw-oldnw)>10/1440 || nargout>0
0090         oldt=newt;
0091         if floor(oldt)==floor(nw)
0092             df='HH:MM';
0093         else
0094             df='HH:MM dd-mmm-yyyy';
0095         end
0096         eta=datestr(oldt,df);
0097         if ~nargout
0098             ix=find(fmt=='%',1);
0099             while ~isempty(ix)
0100                 fprintf(2,fmt(1:ix-1));
0101                 fmt=fmt(ix:end);
0102                 ix=find(fmt>='a' & fmt<='z',1); % find letter
0103                 switch fmt(ix)
0104                     case 's'
0105                         fprintf(2,fmt(1:ix),eta);
0106                     case 'd'
0107                         fprintf(2,fmt(1:ix),round(sectogo/60));
0108                     case 'f'
0109                         fprintf(2,fmt(1:ix),frac);
0110                 end
0111                 fmt=fmt(ix+1:end);
0112                 ix=find(fmt=='%',1);
0113             end
0114             fprintf(2,fmt);
0115         end
0116         oldnw=nw;                           %
0117     end
0118 end
0119 etaf=oldt;

Generated on Mon 06-Aug-2018 14:48:32 by m2html © 2003