@Override
  protected long[] inferOutputCharacteristics(MemoTable memo) {
    long[] ret = null;

    Hop input = getInput().get(0);
    MatrixCharacteristics mc = memo.getAllInputStats(input);
    if (mc.dimsKnown()) {
      if (_op == OpOp1.ABS
          || _op == OpOp1.COS
          || _op == OpOp1.SIN
          || _op == OpOp1.TAN
          || _op == OpOp1.ACOS
          || _op == OpOp1.ASIN
          || _op == OpOp1.ATAN
          || _op == OpOp1.SQRT
          || _op == OpOp1.ROUND) // sparsity preserving
      {
        ret = new long[] {mc.getRows(), mc.getCols(), mc.getNonZeros()};
      } else ret = new long[] {mc.getRows(), mc.getCols(), -1};
    }

    return ret;
  }