| 1649 | // |
| 1650 | |
| 1651 | void common_embd_normalize(const float * inp, float * out, int n, int embd_norm) { |
| 1652 | double sum = 0.0; |
| 1653 | |
| 1654 | switch (embd_norm) { |
| 1655 | case -1: // no normalisation |
| 1656 | sum = 1.0; |
| 1657 | break; |
| 1658 | case 0: // max absolute |
| 1659 | for (int i = 0; i < n; i++) { |
| 1660 | if (sum < std::abs(inp[i])) { |
| 1661 | sum = std::abs(inp[i]); |
| 1662 | } |
| 1663 | } |
| 1664 | sum /= 32760.0; // make an int16 range |
| 1665 | break; |
| 1666 | case 2: // euclidean |
| 1667 | for (int i = 0; i < n; i++) { |
| 1668 | sum += inp[i] * inp[i]; |
| 1669 | } |
| 1670 | sum = std::sqrt(sum); |
| 1671 | break; |
| 1672 | default: // p-norm (euclidean is p-norm p=2) |
| 1673 | for (int i = 0; i < n; i++) { |
| 1674 | sum += std::pow(std::abs(inp[i]), embd_norm); |
| 1675 | } |
| 1676 | sum = std::pow(sum, 1.0 / embd_norm); |
| 1677 | break; |
| 1678 | } |
| 1679 | |
| 1680 | const float norm = sum > 0.0 ? 1.0 / sum : 0.0f; |
| 1681 | |
| 1682 | for (int i = 0; i < n; i++) { |
| 1683 | out[i] = inp[i] * norm; |
| 1684 | } |
| 1685 | } |
| 1686 | |
| 1687 | float common_embd_similarity_cos(const float * embd1, const float * embd2, int n){ |
| 1688 | double sum = 0.0; |
no test coverage detected