V_FINISHAT print estimated finish time of a long computation (FRAC,TOL,FMT) Usage: (1) for i=1:many v_finishat((i-1)/many); % initializes on first pass when i=1 ... computation ... end (2) for i=1:many v_finishat([i-1 many]); % alternative argument format ... computation ... end (3) v_finishat(0); % explicit initialization before loop for i=1:many ... computation ... v_finishat(i/many); % calculate fraction completed end (4) for i=1:NI for j=1:NJ for k=1:NK v_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: v_finishat(0); for i=1:many long computation; v_finishat(i/many); end
0001 function [eta,etaf]=v_finishat(frac,tol,fmt) 0002 %V_FINISHAT print estimated finish time of a long computation (FRAC,TOL,FMT) 0003 % Usage: (1) for i=1:many 0004 % v_finishat((i-1)/many); % initializes on first pass when i=1 0005 % ... computation ... 0006 % end 0007 % 0008 % (2) for i=1:many 0009 % v_finishat([i-1 many]); % alternative argument format 0010 % ... computation ... 0011 % end 0012 % 0013 % (3) v_finishat(0); % explicit initialization before loop 0014 % for i=1:many 0015 % ... computation ... 0016 % v_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 % v_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: v_finishat(0); 0041 % for i=1:many 0042 % long computation; 0043 % v_finishat(i/many); 0044 % end 0045 0046 % Copyright (C) Mike Brookes 1998 0047 % Version: $Id: v_finishat.m 10865 2018-09-21 17:22:45Z 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;