| 9 | |
| 10 | |
| 11 | public final class DataFn<T extends ExampleRow> implements VectorFn { |
| 12 | |
| 13 | private final Iterable<? extends T> dat; |
| 14 | private final LinearContribution<T> underlying; |
| 15 | |
| 16 | private final class ObsHolder implements ReducibleObserver<T,ObsHolder> { |
| 17 | private final VEval r; |
| 18 | private final double[] pscratch = new double[underlying.noutcomes()]; |
| 19 | |
| 20 | public ObsHolder(final double[] x, final boolean wantGrad, final boolean wantHessian) { |
| 21 | r = new VEval(x,wantGrad,wantHessian); |
| 22 | } |
| 23 | |
| 24 | @Override |
| 25 | public void observe(final T t) { |
| 26 | underlying.addTerm(r.x,r.gx!=null,r.hx!=null,t,r,pscratch); |
| 27 | } |
| 28 | |
| 29 | @Override |
| 30 | public void observe(final ObsHolder o) { |
| 31 | r.add(o.r); |
| 32 | } |
| 33 | |
| 34 | @Override |
| 35 | public ObsHolder newObserver() { |
| 36 | return new ObsHolder(r.x,r.gx!=null,r.hx!=null); |
| 37 | } |
| 38 | |
| 39 | } |
| 40 | |
| 41 | |
| 42 | |
| 43 | public DataFn(final LinearContribution<T> underlying, final Iterable<? extends T> dat) { |
| 44 | this.underlying = underlying; |
| 45 | this.dat = dat; |
| 46 | } |
| 47 | |
| 48 | @Override |
| 49 | public int dim() { |
| 50 | return underlying.dim(); |
| 51 | } |
| 52 | |
| 53 | |
| 54 | @Override |
| 55 | public VEval eval(final double[] x, final boolean wantGrad, final boolean wantHessian) { |
| 56 | final String logString = "DataFn(" + underlying.getClass().getName() + ")"; |
| 57 | final ThreadedReducer<T,ObsHolder,ObsHolder> reducer = new ThreadedReducer<T,ObsHolder,ObsHolder>(5,logString); |
| 58 | final ObsHolder base = new ObsHolder(x,wantGrad,wantHessian); |
| 59 | reducer.reduce(dat,base); |
| 60 | return base.r; |
| 61 | } |
| 62 | } |
nothing calls this directly
no outgoing calls
no test coverage detected