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
}