docs: public static INDArray reverseTimeSeries(INDArray in, LayerWorkspaceMgr workspaceMgr, ArrayType arrayType){
          if(in == null){
              return null;
          }
  
          if(in.ordering() != 'f' || in.isView() || !Shape.strideDescendingCAscendingF(in)){
              in = workspaceMgr.dup(arrayType, in, 'f');
          }
  
          // FIXME: int cast
          int[] idxs = new int[(int) in.size(2)];
          int j=0;
          for( int i=idxs.length-1; i>=0; i--){
              idxs[j++] = i;
          }
  
          INDArray inReshape = in.reshape('f', in.size(0)*in.size(1), in.size(2));
  
          INDArray outReshape = workspaceMgr.create(arrayType, in.dataType(), new long[]{inReshape.size(0), idxs.length}, 'f');
          Nd4j.pullRows(inReshape, outReshape, 0, idxs);
          return workspaceMgr.leverageTo(arrayType, outReshape.reshape('f', in.size(0), in.size(1), in.size(2)));
  
          /*
          INDArray out = Nd4j.createUninitialized(in.shape(), 'f');
          CustomOp op = DynamicCustomOp.builder("reverse")
                  .addIntegerArguments(new int[]{0,1})
                  .addInputs(in)
                  .addOutputs(out)
                  .callInplace(false)
                  .build();
          Nd4j.getExecutioner().exec(op);
          return out;
          */
      }