utils.c 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include "utils.h"
  4. pyReal distSquared(const pyReal * u, const pyReal * v, const pyWord nFeatures) {
  5. pyWord n;
  6. pyReal s = 0.0, t;
  7. for( n = 0 ; n < nFeatures ; n ++) {
  8. t = u[n] - v[n];
  9. s += t * t;
  10. }
  11. return s;
  12. }
  13. void freeNbhHeaps(SearchParams * params) {
  14. if(params->nbhHeaps.heaps) {
  15. free(params->nbhHeaps.heaps);
  16. params->nbhHeaps.heaps = NULL;
  17. }
  18. if(params->nbhHeaps.distances) {
  19. free(params->nbhHeaps.distances);
  20. params->nbhHeaps.distances = NULL;
  21. }
  22. }
  23. int initNbhHeaps(SearchParams * params) {
  24. pyWord i, j;
  25. pyWord * nbhI;
  26. pyReal * distsI;
  27. params->nbhHeaps.heaps = NULL;
  28. params->nbhHeaps.distances = NULL;
  29. params->nbhHeaps.distances = (pyReal*) malloc((params->nPoints + 1) * params->nbhSize * sizeof(pyReal));
  30. if(params->nbhHeaps.distances == NULL) {
  31. puts("Out of memory!");
  32. return 1;
  33. }
  34. params->nbhHeaps.heaps = (MaxHeap*) malloc((params->nPoints + 1) * sizeof(MaxHeap));
  35. if(params->nbhHeaps.heaps == NULL) {
  36. free(params->nbhHeaps.distances);
  37. params->nbhHeaps.distances = NULL;
  38. puts("Out of memory!");
  39. return 1;
  40. }
  41. // Initialisiere Distanzen und Nachbarschaften
  42. for(i = 0; i < params->nPoints; i ++) {
  43. distsI = &(params->nbhHeaps.distances[i * params->nbhSize]);
  44. nbhI = &(params->neighborhoods[i * params->nbhSize]);
  45. params->nbhHeaps.heaps[i].distances = distsI;
  46. params->nbhHeaps.heaps[i].indices = nbhI;
  47. params->nbhHeaps.heaps[i].maxItems = params->nbhSize;
  48. params->nbhHeaps.heaps[i].size = 1;
  49. for(j = 0; j < params->nbhSize; j ++) {
  50. nbhI[j] = i;
  51. distsI[j] = 0.0;
  52. }
  53. }
  54. return 0;
  55. }