/** * @param c * @param vars * @return * @throws DMLRuntimeException */ private static LiteralOp replaceLiteralFullUnaryAggregateRightIndexing( Hop c, LocalVariableMap vars) throws DMLRuntimeException { LiteralOp ret = null; // full unary aggregate w/ indexed matrix less than 10^6 cells if (c instanceof AggUnaryOp && isReplaceableUnaryAggregate((AggUnaryOp) c) && c.getInput().get(0) instanceof IndexingOp && c.getInput().get(0).getInput().get(0) instanceof DataOp) { IndexingOp rix = (IndexingOp) c.getInput().get(0); Hop data = rix.getInput().get(0); Hop rl = rix.getInput().get(1); Hop ru = rix.getInput().get(2); Hop cl = rix.getInput().get(3); Hop cu = rix.getInput().get(4); if (data instanceof DataOp && vars.keySet().contains(data.getName()) && isIntValueDataLiteral(rl, vars) && isIntValueDataLiteral(ru, vars) && isIntValueDataLiteral(cl, vars) && isIntValueDataLiteral(cu, vars)) { long rlval = getIntValueDataLiteral(rl, vars); long ruval = getIntValueDataLiteral(ru, vars); long clval = getIntValueDataLiteral(cl, vars); long cuval = getIntValueDataLiteral(cu, vars); MatrixObject mo = (MatrixObject) vars.get(data.getName()); // get the dimension information from the matrix object because the hop // dimensions might not have been updated during recompile if (mo.getNumRows() * mo.getNumColumns() < REPLACE_LITERALS_MAX_MATRIX_SIZE) { MatrixBlock mBlock = mo.acquireRead(); MatrixBlock mBlock2 = mBlock.sliceOperations( (int) (rlval - 1), (int) (ruval - 1), (int) (clval - 1), (int) (cuval - 1), new MatrixBlock()); double value = replaceUnaryAggregate((AggUnaryOp) c, mBlock2); mo.release(); // literal substitution (always double) ret = new LiteralOp(value); } } } return ret; }
/** * @param c * @param vars * @return * @throws DMLRuntimeException */ private static LiteralOp replaceLiteralValueTypeCastRightIndexing(Hop c, LocalVariableMap vars) throws DMLRuntimeException { LiteralOp ret = null; // as.scalar/right indexing w/ literals/vars and matrix less than 10^6 cells if (c instanceof UnaryOp && ((UnaryOp) c).getOp() == OpOp1.CAST_AS_SCALAR && c.getInput().get(0) instanceof IndexingOp && c.getInput().get(0).getDataType() == DataType.MATRIX) { IndexingOp rix = (IndexingOp) c.getInput().get(0); Hop data = rix.getInput().get(0); Hop rl = rix.getInput().get(1); Hop ru = rix.getInput().get(2); Hop cl = rix.getInput().get(3); Hop cu = rix.getInput().get(4); if (rix.dimsKnown() && rix.getDim1() == 1 && rix.getDim2() == 1 && data instanceof DataOp && vars.keySet().contains(data.getName()) && isIntValueDataLiteral(rl, vars) && isIntValueDataLiteral(ru, vars) && isIntValueDataLiteral(cl, vars) && isIntValueDataLiteral(cu, vars)) { long rlval = getIntValueDataLiteral(rl, vars); long clval = getIntValueDataLiteral(cl, vars); MatrixObject mo = (MatrixObject) vars.get(data.getName()); // get the dimension information from the matrix object because the hop // dimensions might not have been updated during recompile if (mo.getNumRows() * mo.getNumColumns() < REPLACE_LITERALS_MAX_MATRIX_SIZE) { MatrixBlock mBlock = mo.acquireRead(); double value = mBlock.getValue((int) rlval - 1, (int) clval - 1); mo.release(); // literal substitution (always double) ret = new LiteralOp(value); } } } return ret; }