fun parseModelWeights()

in facebook-core/src/main/java/com/facebook/appevents/ml/Utils.kt [83:136]


  fun parseModelWeights(file: File): Map<String, MTensor>? {
    try {
      val inputStream: InputStream = FileInputStream(file)
      val length = inputStream.available()
      val dataIs = DataInputStream(inputStream)
      val allData = ByteArray(length)
      dataIs.readFully(allData)
      dataIs.close()
      if (length < 4) {
        return null
      }
      var bb = ByteBuffer.wrap(allData, 0, 4)
      bb.order(ByteOrder.LITTLE_ENDIAN)
      val jsonLen = bb.int
      if (length < jsonLen + 4) {
        return null
      }
      val jsonStr = String(allData, 4, jsonLen)
      val info = JSONObject(jsonStr)
      val names = info.names()
      val keys = arrayOfNulls<String>(names.length())
      for (i in keys.indices) {
        keys[i] = names.getString(i)
      }
      keys.sort()
      var offset = 4 + jsonLen
      val weights = hashMapOf<String, MTensor>()
      for (key in keys) {
        if (key == null) {
          continue
        }
        var count = 1
        val shapes = info.getJSONArray(key)
        val shape = IntArray(shapes.length())
        for (i in shape.indices) {
          shape[i] = shapes.getInt(i)
          count *= shape[i]
        }
        if (offset + count * 4 > length) {
          return null
        }
        bb = ByteBuffer.wrap(allData, offset, count * 4)
        bb.order(ByteOrder.LITTLE_ENDIAN)
        val tensor = MTensor(shape)
        bb.asFloatBuffer()[tensor.data, 0, count]
        weights[key] = tensor
        offset += count * 4
      }
      return weights
    } catch (e: Exception) {
      /* no op */
    }
    return null
  }