1
0

mean.hpp 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. #include "common.h"
  2. #include "llama.h"
  3. #include "ggml.h"
  4. #include <string>
  5. #include <vector>
  6. #include <math.h>
  7. namespace mean {
  8. static void run(
  9. const std::vector<struct ggml_tensor *> & v_input, // shape of v_input[0]: [n_embd, n_samples]
  10. const std::vector<struct ggml_tensor *> & v_output) {
  11. printf("%s: Running mean...\n", __func__);
  12. for (size_t il = 0; il < v_input.size(); ++il) {
  13. // prepare output vector
  14. struct ggml_tensor * ctrl_out = v_output[il];
  15. ggml_format_name(ctrl_out, "direction.%zu", il+1);
  16. // calculate mean vector
  17. struct ggml_tensor * t_layer = v_input[il];
  18. GGML_ASSERT(t_layer->ne[0] == ctrl_out->ne[0]); // == n_embd
  19. for (int ic = 0; ic < t_layer->ne[0]; ic++) {
  20. float f = 0.0;
  21. for (int ir = 0; ir < t_layer->ne[1]; ir++) {
  22. f += ggml_get_f32_nd(t_layer, ic, ir, 0, 0);
  23. }
  24. f /= t_layer->ne[1];
  25. ggml_set_f32_1d(ctrl_out, ic, f);
  26. }
  27. // normalize output vector
  28. float norm = 0.0;
  29. for (int i = 0; i < ggml_nelements(ctrl_out); i++) {
  30. float f = ggml_get_f32_1d(ctrl_out, i);
  31. norm += f*f;
  32. }
  33. norm = sqrt(norm);
  34. for (int i = 0; i < ggml_nelements(ctrl_out); i++) {
  35. float f = ggml_get_f32_1d(ctrl_out, i);
  36. ggml_set_f32_1d(ctrl_out, i, f / norm);
  37. }
  38. printf("%s: Done layer %d / %d\n", __func__, (int) il+1, (int) v_input.size());
  39. }
  40. }
  41. }