Dormouses

super_prac

Nov 18th, 2016
29
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 5.47 KB | None | 0 0
  1. #define MAX_DATA_POINTS 10000
  2. #define MAX_CLUSTER 101
  3. #define MAX_DATA_DIMENSION 5
  4. #include <math.h>
  5. #include <stdio.h>
  6. #include <stdlib.h>
  7. #include <string.h>
  8. #include <time.h>
  9. #include <omp.h>
  10.  
  11. int num_data_points;
  12. int num_clusters;
  13. int num_dimensions;
  14. double low_high[MAX_DATA_DIMENSION][2];
  15. double degree_of_memb[MAX_DATA_POINTS][MAX_CLUSTER];
  16. double epsilon;
  17. double fuzziness;
  18. double data_point[MAX_DATA_POINTS][MAX_DATA_DIMENSION];
  19. double cluster_centre[MAX_CLUSTER][MAX_DATA_DIMENSION];
  20.  
  21. int real_number_data_points;
  22.  
  23. int
  24. init(char *fname) {
  25.     int i, j, r, rval;
  26.     FILE *f;
  27.     double s;
  28.     if ((f = fopen(fname, "r")) == NULL) {
  29.         printf("Failed to open input file.");
  30.         return -1;
  31.     }
  32.     fscanf(f, "%d %d %d", &num_data_points, &num_clusters, &num_dimensions);
  33.     num_data_points=real_number_data_points;//добавлено
  34.     if (num_clusters > MAX_CLUSTER) {
  35.         printf("Number of clusters should be < %d\n", MAX_CLUSTER);
  36.         goto failure;
  37.     }
  38.     if (num_data_points > MAX_DATA_POINTS) {
  39.         printf("Number of data points should be < %d\n", MAX_DATA_POINTS);
  40.         goto failure;
  41.     }
  42.     if (num_dimensions > MAX_DATA_DIMENSION) {
  43.         printf("Number of dimensions should be >= 1.0 and < %d\n",
  44.                MAX_DATA_DIMENSION);
  45.         goto failure;
  46.     }
  47.     fscanf(f, "%lf", &fuzziness);
  48.     if (fuzziness <= 1.0) {
  49.         printf("Fuzzyness coefficient should be > 1.0\n");
  50.         goto failure;
  51.     }
  52.     fscanf(f, "%lf", &epsilon);
  53.     if (epsilon <= 0.0 || epsilon > 1.0) {
  54.         printf("Termination criterion should be > 0.0 and <= 1.0\n");
  55.         goto failure;
  56.     }
  57.     for (i = 0; i < num_data_points; i++) {
  58.         for (j = 0; j < num_dimensions; j++) {
  59.             fscanf(f, "%lf", &data_point[i][j]);
  60.             if (data_point[i][j] < low_high[j][0])
  61.                 low_high[j][0] = data_point[i][j];
  62.             if (data_point[i][j] > low_high[j][1])
  63.                 low_high[j][1] = data_point[i][j];
  64.         }
  65.     }
  66.     #pragma omp parallel for shared(degree_of_memb) private(i, j, rval)
  67.     for (i = 0; i < num_data_points; i++) {
  68.         s = 0.0;
  69.         r = 100;
  70.         #pragma omp parallel for reduction(+:s), reduction(-:r)
  71.         for (j = 1; j < num_clusters; j++) {
  72.             rval = rand() % (r + 1);
  73.             r -= rval;
  74.             degree_of_memb[i][j] = rval / 100.0;
  75.             s += degree_of_memb[i][j];
  76.         }
  77.         degree_of_memb[i][0] = 1.0 - s;
  78.     }
  79.     fclose(f);
  80.     return 0;
  81. failure:
  82.     fclose(f);
  83.     exit(1);
  84. }
  85.  
  86. int
  87. calculate_centre_vectors() {
  88.     int i, j, k;
  89.     double numerator, denominator;
  90.     double t[MAX_DATA_POINTS][MAX_CLUSTER];
  91.  //   i=0;
  92.     #pragma omp parallel private(i, j)
  93.     {
  94.       #pragma omp for collapse (2)
  95.     for (i = 0; i < num_data_points; i++) {
  96.         for (j = 0; j < num_clusters; j++) {
  97.             t[i][j] = pow(degree_of_memb[i][j], fuzziness);
  98.         }
  99.     }
  100.     }
  101.     #pragma omp parallel shared(t, data_point) private(k, j)
  102.     {
  103.     #pragma omp for collapse (2)
  104.     for (j = 0; j < num_clusters; j++) {
  105.         for (k = 0; k < num_dimensions; k++) {
  106.             numerator = 0.0;
  107.             denominator = 0.0;
  108.           #pragma omp parallel for reduction(+:numerator, denominator)
  109.             for (i = 0; i < num_data_points; i++) {
  110.                 numerator += t[i][j] * data_point[i][k];
  111.                 denominator += t[i][j];
  112.             }
  113.             cluster_centre[j][k] = numerator / denominator;
  114.         }
  115.     }
  116.     }
  117.     return 0;
  118. }
  119.  
  120. double
  121. get_norm(int i, int j) {
  122.     int k;
  123.     double sum = 0.0;
  124.     #pragma omp parallel for reduction(+:sum) private(k)
  125.     for (k = 0; k < num_dimensions; k++) {
  126.         sum += pow(data_point[i][k] - cluster_centre[j][k], 2);
  127.     }
  128.    
  129.     return sqrt(sum);
  130. }
  131.  
  132. double
  133. get_new_value(int i, int j) {
  134.     int k;
  135.     double t, p, sum;
  136.     sum = 0.0;
  137.     p = 2 / (fuzziness - 1);
  138.    #pragma omp parallel for reduction(+:sum) private(k, t)
  139.     for (k = 0; k < num_clusters; k++) {
  140.         t = get_norm(i, j) / get_norm(i, k);
  141.         t = pow(t, p);
  142.         sum += t;
  143.     }
  144.    
  145.     return 1.0 / sum;
  146. }
  147.  
  148. double
  149. update_degree_of_membership() {
  150.     int i, j;
  151.     double new_uij;
  152.     double max_diff = 0.0, diff;
  153.    
  154.     #pragma omp parallel private(j, new_uij,diff)
  155.     {
  156.          #pragma omp for collapse (2)
  157.     for (j = 0; j < num_clusters; j++) {
  158.         for (i = 0; i < num_data_points; i++) {
  159.             new_uij = get_new_value(i, j);
  160.             diff = new_uij - degree_of_memb[i][j];
  161.             if (diff > max_diff)
  162.                 max_diff = diff;
  163.             degree_of_memb[i][j] = new_uij;
  164.         }
  165.     }
  166.     }
  167.     return max_diff;
  168. }
  169.  
  170. int
  171. fcm(char *fname) {
  172.     double max_diff;
  173.     int i=0;
  174.     init(fname);
  175.    
  176.     do {
  177.         i++;
  178.         calculate_centre_vectors();
  179.         max_diff = update_degree_of_membership();
  180.     } while (max_diff > epsilon);
  181.     return i;
  182. }
  183.  
  184. int
  185. main(int argc, char **argv) {
  186.     int num_it, i;
  187.     for (i=1; i<=60; i++)
  188.     {
  189.         omp_set_dynamic(0);
  190.         omp_set_num_threads(i);
  191.         for (real_number_data_points=1; real_number_data_points<MAX_DATA_POINTS; real_number_data_points++)
  192.         {
  193.             clock_t before = clock();
  194.             num_it=fcm("file");
  195.             clock_t after = clock();
  196.             printf("%d ", 100*100*real_number_data_points*4*num_it/((after-before)/1000));
  197.         }
  198.         printf("\n");
  199.     }
  200.  
  201.     return 0;
  202. }
Add Comment
Please, Sign In to add comment