/** {@inheritDoc} */ @Override protected double beta(double[] x, double alfa, double beta) { return dataset.computeWithCtx((ctx, data) -> { if (data.getFeatures() == null) return null; int cols = data.getFeatures().length / data.getRows(); BLAS.getInstance().dgemv("N", data.getRows(), cols, alfa, data.getFeatures(), Math.max(1, data.getRows()), x, 1, beta, ctx.getU(), 1); return BLAS.getInstance().dnrm2(ctx.getU().length, ctx.getU(), 1); }, (a, b) -> a == null ? b : b == null ? a : Math.sqrt(a * a + b * b)); }
/** {@inheritDoc} */ @Override protected double[] iter(double bnorm, double[] target) { double[] res = dataset.computeWithCtx((ctx, data) -> { if (data.getFeatures() == null) return null; int cols = data.getFeatures().length / data.getRows(); BLAS.getInstance().dscal(ctx.getU().length, 1 / bnorm, ctx.getU(), 1); double[] v = new double[cols]; BLAS.getInstance().dgemv("T", data.getRows(), cols, 1.0, data.getFeatures(), Math.max(1, data.getRows()), ctx.getU(), 1, 0, v, 1); return v; }, (a, b) -> { if (a == null) return b; else if (b == null) return a; else { BLAS.getInstance().daxpy(a.length, 1.0, a, 1, b, 1); return b; } }); BLAS.getInstance().daxpy(res.length, 1.0, res, 1, target, 1); return target; }
/** * y := alpha * A * x + beta * y. * * @param alpha Alpha. * @param a Matrix a. * @param x Vector x. * @param beta Beta. * @param y Vector y. */ public static void gemv(double alpha, Matrix a, Vector x, double beta, Vector y) { checkCardinality(a, x); if (a.rowSize() != y.size()) throw new CardinalityException(a.columnSize(), y.size()); if (alpha == 0.0 && beta == 1.0) return; if (alpha == 0.0) { scal(y, beta); return; } double[] fA = a.getStorage().data(); double[] fX = x.getStorage().data(); double[] fY = y.getStorage().data(); nativeBlas.dgemv("N", a.rowSize(), a.columnSize(), alpha, fA, a.rowSize(), fX, 1, beta, fY, 1); if (y instanceof SparseVector) y.assign(fY); }
@Override public Vector transMultAdd(double alpha, Vector x, Vector y) { if (!(x instanceof DenseVector) || !(y instanceof DenseVector)) return super.transMultAdd(alpha, x, y); checkTransMultAdd(x, y); double[] xd = ((DenseVector) x).getData(), yd = ((DenseVector) y) .getData(); BLAS.getInstance().dgemv(Transpose.Transpose.netlib(), numRows, numColumns, alpha, data, Math.max(numRows, 1), xd, 1, 1, yd, 1); return y; }
@Override public Vector multAdd(double alpha, Vector x, Vector y) { if (!(x instanceof DenseVector) || !(y instanceof DenseVector)) return super.multAdd(alpha, x, y); checkMultAdd(x, y); double[] xd = ((DenseVector) x).getData(), yd = ((DenseVector) y) .getData(); BLAS.getInstance().dgemv(Transpose.NoTranspose.netlib(), numRows, numColumns, alpha, data, Math.max(numRows, 1), xd, 1, 1, yd, 1); return y; }
@Override public Vector transMultAdd(double alpha, Vector x, Vector y) { if (!(x instanceof DenseVector) || !(y instanceof DenseVector)) return super.transMultAdd(alpha, x, y); checkTransMultAdd(x, y); double[] xd = ((DenseVector) x).getData(), yd = ((DenseVector) y) .getData(); BLAS.getInstance().dgemv(Transpose.Transpose.netlib(), numRows, numColumns, alpha, data, Math.max(numRows, 1), xd, 1, 1, yd, 1); return y; }
@Override public Vector multAdd(double alpha, Vector x, Vector y) { if (!(x instanceof DenseVector) || !(y instanceof DenseVector)) return super.multAdd(alpha, x, y); checkMultAdd(x, y); double[] xd = ((DenseVector) x).getData(), yd = ((DenseVector) y) .getData(); BLAS.getInstance().dgemv(Transpose.NoTranspose.netlib(), numRows, numColumns, alpha, data, Math.max(numRows, 1), xd, 1, 1, yd, 1); return y; }
@Override protected void dgemv(char order, char TransA, int M, int N, double alpha, INDArray A, int lda, INDArray X, int incX, double beta, INDArray Y, int incY) { double[] yData = getDoubleData(Y); BLAS.getInstance().dgemv(String.valueOf(TransA), M, N, alpha, getDoubleData(A), getBlasOffset(A), lda, getDoubleData(X), getBlasOffset(X), incX, beta, yData, getBlasOffset(Y), incY); setData(yData,Y); }
/** * General matrix vector multiplication * * @param A * @param B * @param C * @param alpha * @param beta * @return */ public static INDArray gemv(INDArray A, INDArray B, INDArray C, double alpha, double beta) { BLAS.getInstance().dgemv( "N", A.rows(), A.columns(), alpha, A.data().asDouble(), A.offset(), A.rows(), B.data().asDouble(), B.offset(), C.majorStride(), beta, C.data().asDouble(), C.offset(), C.majorStride()); return C; }
/** * General matrix vector multiplication * * @param A * @param B * @param C * @param alpha * @param beta * @return */ public static INDArray gemv(INDArray A, INDArray B, INDArray C, double alpha, double beta) { BLAS.getInstance().dgemv( "N", A.rows(), A.columns(), alpha, A.data().asDouble(), A.offset(), A.rows(), B.data().asDouble(), B.offset(), C.majorStride(), beta, C.data().asDouble(), C.offset(), C.majorStride()); return C; }