docs: public static ComputationGraph restoreComputationGraph(@NonNull File file, boolean loadUpdater) throws IOException {
          ZipFile zipFile = new ZipFile(file);
  
          boolean gotConfig = false;
          boolean gotCoefficients = false;
          boolean gotUpdaterState = false;
          boolean gotPreProcessor = false;
  
          String json = "";
          INDArray params = null;
          INDArray updaterState = null;
          DataSetPreProcessor preProcessor = null;
  
  
          ZipEntry config = zipFile.getEntry(CONFIGURATION_JSON);
          if (config != null) {
              //restoring configuration
  
              InputStream stream = zipFile.getInputStream(config);
              BufferedReader reader = new BufferedReader(new InputStreamReader(stream));
              String line = "";
              StringBuilder js = new StringBuilder();
              while ((line = reader.readLine()) != null) {
                  js.append(line).append("\n");
              }
              json = js.toString();
  
              reader.close();
              stream.close();
              gotConfig = true;
          }
  
  
          ZipEntry coefficients = zipFile.getEntry(COEFFICIENTS_BIN);
          if (coefficients != null) {
              if(coefficients.getSize() > 0) {
                  InputStream stream = zipFile.getInputStream(coefficients);
                  DataInputStream dis = new DataInputStream(new BufferedInputStream(stream));
                  params = Nd4j.read(dis);
  
                  dis.close();
                  gotCoefficients = true;
              } else {
                  ZipEntry noParamsMarker = zipFile.getEntry(NO_PARAMS_MARKER);
                  gotCoefficients = (noParamsMarker != null);
              }
          }
  
  
          if (loadUpdater) {
              ZipEntry updaterStateEntry = zipFile.getEntry(UPDATER_BIN);
              if (updaterStateEntry != null) {
                  InputStream stream = zipFile.getInputStream(updaterStateEntry);
                  DataInputStream dis = new DataInputStream(new BufferedInputStream(stream));
                  updaterState = Nd4j.read(dis);
  
                  dis.close();
                  gotUpdaterState = true;
              }
          }
  
          ZipEntry prep = zipFile.getEntry(PREPROCESSOR_BIN);
          if (prep != null) {
              InputStream stream = zipFile.getInputStream(prep);
              ObjectInputStream ois = new ObjectInputStream(stream);
  
              try {
                  preProcessor = (DataSetPreProcessor) ois.readObject();
              } catch (ClassNotFoundException e) {
                  throw new RuntimeException(e);
              }
  
              gotPreProcessor = true;
          }
  
  
          zipFile.close();
  
          if (gotConfig && gotCoefficients) {
              ComputationGraphConfiguration confFromJson;
              try{
                  confFromJson = ComputationGraphConfiguration.fromJson(json);
                  if(confFromJson.getNetworkInputs() == null && (confFromJson.getVertices() == null || confFromJson.getVertices().size() == 0)){
                      //May be deserialized correctly, but mostly with null fields
                      throw new RuntimeException("Invalid JSON - not a ComputationGraphConfiguration");
                  }
              } catch (Exception e){
                  if(e.getMessage() != null && e.getMessage().contains("registerLegacyCustomClassesForJSON")){
                      throw e;
                  }
                  try{
                      MultiLayerConfiguration.fromJson(json);
                  } catch (Exception e2){
                      //Invalid, and not a compgraph
                      throw new RuntimeException("Error deserializing JSON ComputationGraphConfiguration. Saved model JSON is" +
                              " not a valid ComputationGraphConfiguration", e);
                  }
                  throw new RuntimeException("Error deserializing JSON ComputationGraphConfiguration. Saved model appears to be " +
                          "a MultiLayerNetwork - use ModelSerializer.restoreMultiLayerNetwork instead");
              }
  
              //Handle legacy config - no network DataType in config, in beta3 or earlier
              if(params != null)
                  confFromJson.setDataType(params.dataType());
  
              ComputationGraph cg = new ComputationGraph(confFromJson);
              cg.init(params, false);
  
  
              if (gotUpdaterState && updaterState != null) {
                  cg.getUpdater().setStateViewArray(updaterState);
              }
              return cg;
          } else
              throw new IllegalStateException("Model wasnt found within file: gotConfig: [" + gotConfig
                      + "], gotCoefficients: [" + gotCoefficients + "], gotUpdater: [" + gotUpdaterState + "]");
      }