use of org.apache.sysml.hops.Hop in project incubator-systemml by apache.
the class RewriteAlgebraicSimplificationDynamic method simplifyColwiseAggregate.
@SuppressWarnings("unchecked")
private static Hop simplifyColwiseAggregate(Hop parent, Hop hi, int pos) {
if (hi instanceof AggUnaryOp) {
AggUnaryOp uhi = (AggUnaryOp) hi;
Hop input = uhi.getInput().get(0);
if (HopRewriteUtils.isValidOp(uhi.getOp(), LOOKUP_VALID_ROW_COL_AGGREGATE)) {
if (uhi.getDirection() == Direction.Col) {
if (input.getDim1() == 1) {
if (uhi.getOp() == AggOp.VAR) {
// For the column variance aggregation, if the input is a row vector,
// the column variances will each be zero.
// Therefore, perform a rewrite from COLVAR(X) to a row vector of zeros.
Hop emptyRow = HopRewriteUtils.createDataGenOp(uhi, input, 0);
HopRewriteUtils.replaceChildReference(parent, hi, emptyRow, pos);
HopRewriteUtils.cleanupUnreferenced(hi, input);
hi = emptyRow;
LOG.debug("Applied simplifyColwiseAggregate for colVars");
} else {
// All other valid column aggregations over a row vector will result
// in the row vector itself.
// Therefore, remove unnecessary col aggregation for 1 row.
HopRewriteUtils.replaceChildReference(parent, hi, input, pos);
HopRewriteUtils.cleanupUnreferenced(hi);
hi = input;
LOG.debug("Applied simplifyColwiseAggregate1");
}
} else if (input.getDim2() == 1) {
// get old parents (before creating cast over aggregate)
ArrayList<Hop> parents = (ArrayList<Hop>) hi.getParent().clone();
// simplify col-aggregate to full aggregate
uhi.setDirection(Direction.RowCol);
uhi.setDataType(DataType.SCALAR);
// create cast to keep same output datatype
UnaryOp cast = HopRewriteUtils.createUnary(uhi, OpOp1.CAST_AS_MATRIX);
// rehang cast under all parents
for (Hop p : parents) {
int ix = HopRewriteUtils.getChildReferencePos(p, hi);
HopRewriteUtils.replaceChildReference(p, hi, cast, ix);
}
hi = cast;
LOG.debug("Applied simplifyColwiseAggregate2");
}
}
}
}
return hi;
}
use of org.apache.sysml.hops.Hop in project incubator-systemml by apache.
the class RewriteAlgebraicSimplificationDynamic method simplifyScalarMatrixMult.
private static Hop simplifyScalarMatrixMult(Hop parent, Hop hi, int pos) {
if (// X%*%Y
HopRewriteUtils.isMatrixMultiply(hi)) {
Hop left = hi.getInput().get(0);
Hop right = hi.getInput().get(1);
// y %*% X -> as.scalar(y) * X
if (// scalar left
HopRewriteUtils.isDimsKnown(left) && left.getDim1() == 1 && left.getDim2() == 1) {
UnaryOp cast = HopRewriteUtils.createUnary(left, OpOp1.CAST_AS_SCALAR);
BinaryOp mult = HopRewriteUtils.createBinary(cast, right, OpOp2.MULT);
// add mult to parent
HopRewriteUtils.replaceChildReference(parent, hi, mult, pos);
HopRewriteUtils.cleanupUnreferenced(hi);
hi = mult;
LOG.debug("Applied simplifyScalarMatrixMult1");
} else // X %*% y -> X * as.scalar(y)
if (// scalar right
HopRewriteUtils.isDimsKnown(right) && right.getDim1() == 1 && right.getDim2() == 1) {
UnaryOp cast = HopRewriteUtils.createUnary(right, OpOp1.CAST_AS_SCALAR);
BinaryOp mult = HopRewriteUtils.createBinary(cast, left, OpOp2.MULT);
// add mult to parent
HopRewriteUtils.replaceChildReference(parent, hi, mult, pos);
HopRewriteUtils.cleanupUnreferenced(hi);
hi = mult;
LOG.debug("Applied simplifyScalarMatrixMult2");
}
}
return hi;
}
use of org.apache.sysml.hops.Hop in project incubator-systemml by apache.
the class RewriteAlgebraicSimplificationDynamic method removeUnnecessaryCumulativeOp.
private static Hop removeUnnecessaryCumulativeOp(Hop parent, Hop hi, int pos) {
if (hi instanceof UnaryOp && ((UnaryOp) hi).isCumulativeUnaryOperation()) {
// input matrix
Hop input = hi.getInput().get(0);
if (// dims input known
HopRewriteUtils.isDimsKnown(input) && // 1 row
input.getDim1() == 1) {
OpOp1 op = ((UnaryOp) hi).getOp();
// remove unnecessary unary cumsum operator
HopRewriteUtils.replaceChildReference(parent, hi, input, pos);
hi = input;
LOG.debug("Applied removeUnnecessaryCumulativeOp: " + op);
}
}
return hi;
}
use of org.apache.sysml.hops.Hop in project incubator-systemml by apache.
the class RewriteAlgebraicSimplificationDynamic method pushdownBinaryOperationOnDiag.
@SuppressWarnings("unchecked")
private static Hop pushdownBinaryOperationOnDiag(Hop parent, Hop hi, int pos) {
// (2) in order to make the binary operation more efficient (dense vector vs sparse matrix)
if (HopRewriteUtils.isBinary(hi, OpOp2.MULT)) {
Hop left = hi.getInput().get(0);
Hop right = hi.getInput().get(1);
boolean applyLeft = false;
boolean applyRight = false;
// left input is diag
if (left instanceof ReorgOp && ((ReorgOp) left).getOp() == ReOrgOp.DIAG && // binary op only parent
left.getParent().size() == 1 && // col vector
left.getInput().get(0).getDim2() == 1 && right.getDataType() == DataType.SCALAR) {
applyLeft = true;
} else if (right instanceof ReorgOp && ((ReorgOp) right).getOp() == ReOrgOp.DIAG && // binary op only parent
right.getParent().size() == 1 && // col vector
right.getInput().get(0).getDim2() == 1 && left.getDataType() == DataType.SCALAR) {
applyRight = true;
}
// perform actual rewrite
if (applyLeft || applyRight) {
// remove all parent links to binary op (since we want to reorder
// we cannot just look at the current parent)
ArrayList<Hop> parents = (ArrayList<Hop>) hi.getParent().clone();
ArrayList<Integer> parentspos = new ArrayList<>();
for (Hop lparent : parents) {
int lpos = HopRewriteUtils.getChildReferencePos(lparent, hi);
HopRewriteUtils.removeChildReferenceByPos(lparent, hi, lpos);
parentspos.add(lpos);
}
// rewire binop-diag-input into diag-binop-input
if (applyLeft) {
Hop input = left.getInput().get(0);
HopRewriteUtils.removeChildReferenceByPos(hi, left, 0);
HopRewriteUtils.removeChildReferenceByPos(left, input, 0);
HopRewriteUtils.addChildReference(left, hi, 0);
HopRewriteUtils.addChildReference(hi, input, 0);
hi.refreshSizeInformation();
hi = left;
} else if (applyRight) {
Hop input = right.getInput().get(0);
HopRewriteUtils.removeChildReferenceByPos(hi, right, 1);
HopRewriteUtils.removeChildReferenceByPos(right, input, 0);
HopRewriteUtils.addChildReference(right, hi, 0);
HopRewriteUtils.addChildReference(hi, input, 1);
hi.refreshSizeInformation();
hi = right;
}
// relink all parents to the diag operation
for (int i = 0; i < parents.size(); i++) {
Hop lparent = parents.get(i);
int lpos = parentspos.get(i);
HopRewriteUtils.addChildReference(lparent, hi, lpos);
}
LOG.debug("Applied pushdownBinaryOperationOnDiag.");
}
}
return hi;
}
use of org.apache.sysml.hops.Hop in project incubator-systemml by apache.
the class RewriteAlgebraicSimplificationDynamic method simplifyEmptyReorgOperation.
private static Hop simplifyEmptyReorgOperation(Hop parent, Hop hi, int pos) {
if (hi instanceof ReorgOp) {
ReorgOp rhi = (ReorgOp) hi;
Hop input = rhi.getInput().get(0);
if (// empty input
HopRewriteUtils.isEmpty(input)) {
// reorg-operation-specific rewrite
Hop hnew = null;
if (rhi.getOp() == ReOrgOp.TRANSPOSE)
hnew = HopRewriteUtils.createDataGenOp(input, true, input, true, 0);
else if (rhi.getOp() == ReOrgOp.REV)
hnew = HopRewriteUtils.createDataGenOp(input, 0);
else if (rhi.getOp() == ReOrgOp.DIAG) {
if (HopRewriteUtils.isDimsKnown(input)) {
if (// diagv2m
input.getDim2() == 1)
hnew = HopRewriteUtils.createDataGenOp(input, false, input, true, 0);
else
// diagm2v
hnew = HopRewriteUtils.createDataGenOpByVal(HopRewriteUtils.createValueHop(input, true), new LiteralOp(1), 0);
}
} else if (rhi.getOp() == ReOrgOp.RESHAPE)
hnew = HopRewriteUtils.createDataGenOpByVal(rhi.getInput().get(1), rhi.getInput().get(2), 0);
// modify dag if one of the above rules applied
if (hnew != null) {
HopRewriteUtils.replaceChildReference(parent, hi, hnew, pos);
hi = hnew;
LOG.debug("Applied simplifyEmptyReorgOperation");
}
}
}
return hi;
}
Aggregations