* @param drmA DRM representing matrix A.
* @param x in-core Mahout Vector.
* @return new DRM containing A'x.
*/
public static H2ODrm exec(H2ODrm drmA, Vector x) {
Frame A = drmA.frame;
final H2OBCast<Vector> bx = new H2OBCast<Vector>(x);
// A'x is computed into atx[] with an MRTask on A (with
// x available as a Broadcast
//
// x.size() == A.numRows()
// atx.length == chks.length == A.numCols()
class MRTaskAtx extends MRTask<MRTaskAtx> {
double atx[];
public void map(Chunk chks[]) {
int chunkSize = chks[0].len();
Vector x = bx.value();
long start = chks[0].start();
atx = new double[chks.length];
for (int r = 0; r < chunkSize; r++) {
double d = x.getQuick((int)start + r);
for (int c = 0; c < chks.length; c++) {
atx[c] += (chks[c].at0(r) * d);
}
}
}
public void reduce(MRTaskAtx other) {
ArrayUtils.add(atx, other.atx);
}
}
// Take the result in .atx[], and convert into a Frame
// using existing helper functions (creating a Matrix
// along the way for the Helper)
Vector v = new DenseVector(new MRTaskAtx().doAll(A).atx);
Matrix m = new DenseMatrix(A.numCols(), 1);
m.assignColumn(0, v);
return H2OHelper.drmFromMatrix(m, -1, -1);
}