code: @Override
    public final double[] score0(double[] doubles, double offset, double[] preds) {
      assert(doubles != null) : "doubles are null";
      float[] floats;
      int cats = _catOffsets == null ? 0 : _catOffsets[_cats];
      if (_nums > 0) {
        floats = new float[_nums + cats]; //TODO: use thread-local storage
        GenModel.setInput(doubles, floats, _nums, _cats, _catOffsets, _normMul, _normSub, _useAllFactorLevels, true);
      } else {
        floats = new float[doubles.length];
        for (int i=0; i<floats.length; ++i) {
          floats[i] = (float) doubles[i] - (_meanImageData == null ? 0 : _meanImageData[i]);
        }
      }
      float[] predFloats = _backend.predict(_model, floats);
      assert(_nclasses == predFloats.length) : "nclasses " + _nclasses + " predFloats.length " + predFloats.length;
      if (_nclasses > 1) {
        for (int i = 0; i < predFloats.length; ++i)
          preds[1 + i] = predFloats[i];
        if (_balanceClasses)
          GenModel.correctProbabilities(preds, _priorClassDistrib, _modelClassDistrib);
        preds[0] = GenModel.getPrediction(preds, _priorClassDistrib, doubles, _defaultThreshold);
      } else {
        if (_normRespMul!=null && _normRespSub!=null)
          preds[0] = predFloats[0] * _normRespMul[0] + _normRespSub[0];
        else
          preds[0] = predFloats[0];
      }
      return preds;
    }
docs: Corresponds to `hex.DeepWater.score0()`