diff --git a/src/io.c b/src/io.c index 3bd31f2965d61ca178dac23b70a5633636dd74e0..4184aa1b8c45ad118a660d08986fc7e2c4cb583b 100644 --- a/src/io.c +++ b/src/io.c @@ -21,10 +21,10 @@ fpt_t read_fpt(FILE* file) { vector_int_t* line_to_vector_int(char* line, const size_t dim) { - vector_int_t* vector = vector_int_create(dim); + vector_int_t* vector = vector_create_int(dim); char* tgt = line; char* token = NULL; - for (size_t i = 0; i < vector->dim; ++i, tgt = NULL) { + for (size_t i = 0; i < dim; ++i, tgt = NULL) { token = strtok(tgt, ","); // strtol returns 0 if number not read, which is the desired behaviour: vector->data[i] = token != NULL ? strtol(token, NULL, 10) : 0; @@ -33,10 +33,10 @@ vector_int_t* line_to_vector_int(char* line, const size_t dim) { } vector_fpt_t* line_to_vector_fpt(char* line, const size_t dim) { - vector_fpt_t* vector = vector_fpt_create(dim); + vector_fpt_t* vector = vector_create_fpt(dim); char* tgt = line; char* token = NULL; - for (size_t i = 0; i < vector->dim; ++i, tgt = NULL) { + for (size_t i = 0; i < dim; ++i, tgt = NULL) { token = strtok(tgt, ","); // strtol returns 0 if number not read, which is the desired behaviour: vector->data[i] = token != NULL ? strtod(token, NULL) : 0; @@ -74,25 +74,34 @@ list_points_fpt_t* get_vector_list_fpt(FILE* ifile, const size_t dim) { } -static int _point_compare_clusters_int_(const void* p1, const void* p2) { - const point_int_t* point1 = (const point_int_t*) p1; - const point_int_t* point2 = (const point_int_t*) p2; - return point1->cluster < point2->cluster ? -1 : point1->cluster > point2->cluster ? 1 : 0; +void io_write_clusters_to_file_int(FILE* file, cluster_int_t** clusters, const size_t cluster_count) { + for (size_t i = 0; i < cluster_count; ++i) { + fprintf(file, "\n*\n"); + list_points_node_int_t* node = clusters[i]->points->head; + while (node != NULL) { + const vector_int_t point = *(node->point); + fprintf(file, "%ld", point.data[0]); + for (size_t p = 1; p < point.dim; ++p) { + fprintf(file, " , %ld", point.data[p]); + } + fprintf(file, "\n"); + node = node->next; + } + } } - -void io_write_clusters_to_file_int(FILE* file, point_int_t** points, const size_t point_count) { - qsort(points, point_count, sizeof(point_int_t*), _point_compare_clusters_int_); // group points by cluster - vector_int_t* current_cluster = NULL; - point_int_t* current_point = NULL; - for (size_t i = 0; i < point_count; ++i) { - current_point = points[i]; - if (current_point->cluster != current_cluster) { - current_cluster = current_point->cluster; - fprintf(file, "\n*\n"); +void io_write_clusters_to_file_fpt(FILE* file, cluster_fpt_t** clusters, const size_t cluster_count) { + for (size_t i = 0; i < cluster_count; ++i) { + fprintf(file, "\n*\n"); + list_points_node_fpt_t* node = clusters[i]->points->head; + while (node != NULL) { + const vector_fpt_t point = *(node->point); + fprintf(file, "%lf", point.data[0]); + for (size_t p = 1; p < point.dim; ++p) { + fprintf(file, " , %lf", point.data[p]); + } + fprintf(file, "\n"); + node = node->next; } - vector_print_to_file_int(file, current_point->vector); } } - -void io_write_clusters_to_file_fpt(FILE* file, point_fpt_t** points, const size_t point_count) {} diff --git a/src/io.h b/src/io.h index 2487aabd2fb98b8a07379f275352d5bdc020500b..a5d5957a012679020123f0a0f125bed738ef85d2 100644 --- a/src/io.h +++ b/src/io.h @@ -2,6 +2,7 @@ #define PROG_KMEANS_IO_H #include <stdio.h> +#include "cluster.h" #include "common.h" #include "linkedlist.h" #include "vector.h" @@ -22,9 +23,9 @@ list_points_int_t* get_vector_list_int(FILE* ifile, const size_t dim); list_points_fpt_t* get_vector_list_fpt(FILE* ifile, const size_t dim); -void io_write_clusters_to_file_int(FILE* file, point_int_t** points, const size_t point_count); +void io_write_clusters_to_file_int(FILE* file, cluster_int_t** clusters, const size_t cluster_count); -void io_write_clusters_to_file_fpt(FILE* file, point_fpt_t** points, const size_t point_count); +void io_write_clusters_to_file_fpt(FILE* file, cluster_fpt_t** clusters, const size_t cluster_count); #endif //PROG_KMEANS_IO_H