| 1339 | // |
| 1340 | |
| 1341 | void common_embd_normalize(const float * inp, float * out, int n, int embd_norm) { |
| 1342 | double sum = 0.0; |
| 1343 | |
| 1344 | switch (embd_norm) { |
| 1345 | case -1: // no normalisation |
| 1346 | sum = 1.0; |
| 1347 | break; |
| 1348 | case 0: // max absolute |
| 1349 | for (int i = 0; i < n; i++) { |
| 1350 | if (sum < std::abs(inp[i])) { |
| 1351 | sum = std::abs(inp[i]); |
| 1352 | } |
| 1353 | } |
| 1354 | sum /= 32760.0; // make an int16 range |
| 1355 | break; |
| 1356 | case 2: // euclidean |
| 1357 | for (int i = 0; i < n; i++) { |
| 1358 | sum += inp[i] * inp[i]; |
| 1359 | } |
| 1360 | sum = std::sqrt(sum); |
| 1361 | break; |
| 1362 | default: // p-norm (euclidean is p-norm p=2) |
| 1363 | for (int i = 0; i < n; i++) { |
| 1364 | sum += std::pow(std::abs(inp[i]), embd_norm); |
| 1365 | } |
| 1366 | sum = std::pow(sum, 1.0 / embd_norm); |
| 1367 | break; |
| 1368 | } |
| 1369 | |
| 1370 | const float norm = sum > 0.0 ? 1.0 / sum : 0.0f; |
| 1371 | |
| 1372 | for (int i = 0; i < n; i++) { |
| 1373 | out[i] = inp[i] * norm; |
| 1374 | } |
| 1375 | } |
| 1376 | |
| 1377 | float common_embd_similarity_cos(const float * embd1, const float * embd2, int n){ |
| 1378 | double sum = 0.0; |
no test coverage detected