Skip to content

Commit 4e66620

Browse files
committed
Estimate remaining time (estimate WAY under)
1 parent d24456f commit 4e66620

File tree

2 files changed

+93
-6
lines changed

2 files changed

+93
-6
lines changed

Count/src/com/mzlabs/count/ctab/CTab.java

Lines changed: 25 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
import com.mzlabs.count.op.impl.ThreadedSum;
1616
import com.mzlabs.count.op.iter.OrderStepperTot;
1717
import com.mzlabs.count.util.IntVec;
18+
import com.mzlabs.count.util.LinearFitter;
1819
import com.mzlabs.count.zeroone.ZeroOneCounter;
1920

2021

@@ -219,17 +220,35 @@ public static BigInteger debugConfirmSqTables(final int rowsCols, final int tota
219220
}
220221

221222
public static void main(final String[] args) {
222-
System.out.println("n" + "\t" + "total" + "\t" + "count" + "\t" + "date" + "\t" + "cacheSizes");
223-
for(int n=1;n<=10;++n) {
223+
System.out.println("n" + "\t" + "total" + "\t" + "target" + "\t" + "count" + "\t" + "date" + "\t" + "cacheSizes" + "\t" + "tableFinishTimeEst");
224+
for(int n=8;n<=10;++n) {
224225
final CTab ctab = new CTab(n,true);
225-
for(int total=0;total<=(n*n-3*n+2)/2;++total) {
226+
final LinearFitter lf = new LinearFitter(1);
227+
final int tLast = (n*n-3*n+2)/2;
228+
for(int total=0;total<=tLast;++total) {
229+
final Date startTime = new Date();
226230
final BigInteger count = ctab.countSqTables(n,total);
227231
final String cacheSizes = ctab.cacheSizesString();
228-
ctab.clearCaches();
229-
System.out.println("" + n + "\t" + total + "\t" + count + "\t" + new Date() + "\t" + cacheSizes);
232+
final Date curTime = new Date();
233+
long remainingTimeEstMS = 10000;
234+
if(total>0) {
235+
// simplistic model: log(time) ~ a + b*size
236+
final double[] x = { total };
237+
final double y = 10000.0+curTime.getTime() - startTime.getTime();
238+
lf.addObservation(x, Math.log(y), y);
239+
final double[] beta = lf.solve();
240+
double timeEstMS = 0.0;
241+
for(int j=total+1;j<=tLast;++j) {
242+
final double predict = LinearFitter.predict(beta,new double[] {j});
243+
timeEstMS += Math.exp(predict);
244+
}
245+
remainingTimeEstMS = (long)Math.ceil(timeEstMS);
246+
}
247+
final Date finishTimeEst = new Date(curTime.getTime()+remainingTimeEstMS);
248+
System.out.println("" + n + "\t" + total + "\t" + tLast + "\t" + count + "\t" + curTime + "\t" + cacheSizes + "\t" + finishTimeEst);
230249
}
250+
ctab.clearCaches();
231251
}
232-
//System.out.println("total evals: " + SolnCache.totalEvals);
233252
}
234253

235254
}
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
package com.mzlabs.count.util;
2+
3+
import com.winvector.linalg.LinalgFactory;
4+
import com.winvector.linalg.colt.ColtMatrix;
5+
6+
7+
/**
8+
* Fit y ~ a + b.x (least squares)
9+
* @author johnmount
10+
*
11+
*/
12+
public final class LinearFitter {
13+
private final ColtMatrix xTx;
14+
private final double[] xTy;
15+
16+
/**
17+
*
18+
* @param n dimension of x-vectors
19+
*/
20+
public LinearFitter(final int n) {
21+
final LinalgFactory<ColtMatrix> factory = ColtMatrix.factory;
22+
xTx = factory.newMatrix(n+1,n+1,false);
23+
xTy = new double[n+1];
24+
}
25+
26+
/**
27+
* add a y ~ f(x) observation
28+
* @param x
29+
* @param y
30+
* @param wt weight of observation (set to 1.0 in many cases)
31+
*/
32+
public void addObservation(final double[] x, final double y, final double wt) {
33+
final int n = xTx.rows()-1;
34+
for(int i=0;i<=n;++i) {
35+
final double xi = i<n?x[i]:1.0;
36+
xTy[i] += wt*xi*y;
37+
for(int j=0;j<=n;++j) {
38+
final double xj = j<n?x[j]:1.0;
39+
xTx.set(i,j,xTx.get(i, j)+wt*xi*xj);
40+
}
41+
}
42+
}
43+
44+
public double[] solve() {
45+
final int n = xTx.rows()-1;
46+
final double epsilon = 1.0e-5;
47+
final double[] xTxii = new double[n+1];
48+
for(int i=0;i<=n;++i) {
49+
xTxii[i] = xTx.get(i,i);
50+
xTx.set(i,i,xTxii[i]+epsilon); // Ridge term
51+
}
52+
final double[] soln = xTx.solve(xTy);
53+
for(int i=0;i<=n;++i) {
54+
xTx.set(i,i,xTxii[i]);
55+
}
56+
return soln;
57+
}
58+
59+
public static double predict(final double[] soln, final double[] x) {
60+
final int n = soln.length-1;
61+
double sum = 0.0;
62+
for(int i=0;i<=n;++i) {
63+
final double xi = i<n?x[i]:1.0;
64+
sum += xi*soln[i];
65+
}
66+
return sum;
67+
}
68+
}

0 commit comments

Comments
 (0)