


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

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. 0050 % Home page: http://www.ee.ic.ac.uk/hp/staff/dmb/voicebox/voicebox.html 0051 % 0052 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 0053 % This program is free software; you can redistribute it and/or modify 0054 % it under the terms of the GNU General Public License as published by 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;