docs: public String asFlatPrint() {
          val sb = new StringBuilder();
          val fb = asFlatBuffers();
  
          val graph = FlatGraph.getRootAsFlatGraph(fb);
  
          sb.append("\nExternal variables:\n\n");
          for (int e = 0; e < graph.variablesLength(); e++) {
              val var = graph.variables(e);
              INDArray ndarray = null;
              try(MemoryWorkspace ws = Nd4j.getWorkspaceManager().scopeOutOfWorkspaces()) {
                  FlatArray fa = var.ndarray();
                  if(fa != null) {
                      ndarray = Nd4j.createFromFlatArray(fa);
                  }
              }
  
              sb.append(var.id().first())
                      .append(":<").append(var.name()).append("> ");
              if(ndarray == null){
                  sb.append("<no array>").append("; Values: ").append("<no array>").append(";\n");
              } else {
                  sb.append(Arrays.toString(ndarray.shapeInfoDataBuffer().asInt())).append("; Values: ");
                  if(ndarray.data() == null){
                      //Empty array
                      sb.append("<empty array>");
                  } else if(ndarray.dataType() == DataType.UTF8) {
                      sb.append("<string array>");
                  } else {
                      if(ndarray.length() < 50){
                          sb.append(Arrays.toString(ndarray.data().asFloat()).replaceAll(" ",""));
                      } else {
                          //Array is too long - only tak. last few values...
                          sb.append("[");
                          for( int i=0; i<50; i++ ){
                              if(i > 0)
                                  sb.append(",");
                              sb.append(ndarray.data().getFloat(i));
                          }
                          sb.append("]");
                      }
                  }
                  sb.append(";\n");
              }
  
          }
  
          val map = Nd4j.getExecutioner().getCustomOperations();
  
  
          sb.append("\nOps sequence:\n\n");
          for (int e = 0; e < graph.nodesLength(); e++) {
              val node = graph.nodes(e);
  
              log.info("{}:<{}>", node.id(), node.name());
              sb.append(node.id())
                      .append(":<").append(node.name()).append("> ").append(FlatBuffersMapper.getTypeFromByte(node.opType()));
  
              if (FlatBuffersMapper.getTypeFromByte(node.opType()) != Op.Type.CUSTOM)
                  sb.append(": ").append(node.opNum());
              else {
                  val keys = map.keySet();
                  String opName = null;
                  for (val k : keys) {
                      val d = map.get(k);
                      if (d.getHash() == node.opNum())
                          opName = k;
                  }
  
                  if (opName == null)
                      opName = "unknown";
  
                  sb.append(": ").append(opName);
              }
  
              sb.append("; Inputs: {");
  
              for (int i = 0; i < node.inputPairedLength(); i++) {
                  val pair = node.inputPaired(i);
  
                  sb.append("[").append(pair.first()).append(":").append(pair.second()).append("]");
  
                  if (i < node.inputPairedLength() - 1)
                      sb.append(", ");
              }
  
              sb.append("};");
              sb.append(" OpNum: {").append(node.opNum()).append("};");
  
              sb.append("\n");
          }
  
  
          return sb.toString();
      }