From 8ffcc39c9c2f107718992de76c2974af93ad693d Mon Sep 17 00:00:00 2001 From: AustrianToast Date: Tue, 22 Oct 2024 23:38:00 +0200 Subject: [PATCH] testing around with structs --- graph.c | 18 ++++++++++++ graph.h | 4 ++- main.c | 87 +++++++++++++++++++++----------------------------------- matrix.c | 25 ++++++++++++++++ matrix.h | 6 ++++ 5 files changed, 84 insertions(+), 56 deletions(-) diff --git a/graph.c b/graph.c index 3e16714..7a410d9 100644 --- a/graph.c +++ b/graph.c @@ -19,6 +19,24 @@ void random_adjacency(const ulong vertex_count, ulong matrix[vertex_count][verte } } +void random_adjacency_struct(const Matrix *matrix) { + if (matrix->row_length != matrix->column_length) { + return; + } + + srand(time(NULL)); + + for (ulong row_index = 0; row_index < matrix->row_length; row_index++) { + for (ulong column_index = 0; column_index < matrix->column_length; column_index++) { + if (column_index == row_index) { + matrix->values[row_index][column_index] = 0; + } else { + matrix->values[row_index][column_index] = rand() % 2; + } + } + } +} + void calculate_distance_matrix(const ulong vertex_count, const ulong adjacency_matrix[vertex_count][vertex_count], ulong distance_matrix[vertex_count][vertex_count]) { ulong power_matrix[vertex_count][vertex_count]; ulong temp_power_matrix[vertex_count][vertex_count]; diff --git a/graph.h b/graph.h index 99e2759..578a0e3 100644 --- a/graph.h +++ b/graph.h @@ -1,11 +1,13 @@ #ifndef GRAPH_H #define GRAPH_H -typedef unsigned long ulong; +#include "matrix.h" void random_adjacency(const ulong vertex_count, ulong matrix[vertex_count][vertex_count]); +void random_adjacency_struct(const Matrix *matrix); + void calculate_distance_matrix(const ulong vertex_count, const ulong adjacency_matrix[vertex_count][vertex_count], ulong distance_matrix[vertex_count][vertex_count]); diff --git a/main.c b/main.c index 557a7f1..a7e5c84 100644 --- a/main.c +++ b/main.c @@ -5,8 +5,6 @@ #include #include -typedef struct matrix {ulong row_length; ulong column_length; ulong **values;} Matrix; - void benchmark_gemm() { const ulong vertex_count = 100; ulong adjacency_matrix1[vertex_count][vertex_count]; @@ -266,64 +264,43 @@ void test_with_dfs() { // free(articulations); } -void print_matrix_struct(const Matrix *matrix) { - for (ulong column_index=0; column_index < matrix->column_length; column_index++) { - for (ulong row_index=0; row_index < matrix->row_length; row_index++) { - printf("%lu ", matrix->values[row_index][column_index]); - } - puts(""); - } -} - -void gemm_structs(const Matrix *matrix1, const Matrix *matrix2, Matrix *output_matrix) { - ulong sum; - - for (ulong i = 0; i < matrix1->row_length; i++) { - for (ulong j = 0; j < matrix2->column_length; j++) { - sum = 0; - - for (ulong k = 0; k < matrix1->row_length; k++) { - sum += matrix1->values[i][k] * matrix2->values[k][j]; - } - - output_matrix->values[i][j] = sum; - } - } -} - -void random_adjacency_struct(const Matrix *matrix) { - if (matrix->row_length != matrix->column_length) { - return; - } - - srand(time(NULL)); - - for (ulong row_index = 0; row_index < matrix->row_length; row_index++) { - for (ulong column_index = 0; column_index < matrix->column_length; column_index++) { - if (column_index == row_index) { - matrix->values[row_index][column_index] = 0; - } else { - matrix->values[row_index][column_index] = rand() % 2; - } - } - } -} - void test_with_structs() { - ulong row_length = 5, column_length = 10; - ulong **values = (ulong**)malloc(row_length * sizeof(ulong*)); - for (ulong index = 0; index < row_length; index++) { - values[index] = (ulong*)malloc(column_length * sizeof(ulong)); - } - Matrix adjacency_matrix = {row_length, column_length, values}; + ulong row_length = 5, column_length = 5; - random_adjacency_struct(&adjacency_matrix); - print_matrix_struct(&adjacency_matrix); + ulong **values1 = (ulong**)malloc(row_length * sizeof(ulong*)); + ulong **values2 = (ulong**)malloc(row_length * sizeof(ulong*)); + ulong **values3 = (ulong**)malloc(row_length * sizeof(ulong*)); for (ulong index = 0; index < row_length; index++) { - free(values[index]); + values1[index] = (ulong*)malloc(column_length * sizeof(ulong)); + values2[index] = (ulong*)malloc(column_length * sizeof(ulong)); + values3[index] = (ulong*)malloc(column_length * sizeof(ulong)); } - free(values); + + Matrix adjacency_matrix1 = {row_length, column_length, values1}; + Matrix adjacency_matrix2 = {row_length, column_length, values2}; + Matrix dot_product = {row_length, column_length, values3}; + + random_adjacency_struct(&adjacency_matrix1); + print_matrix_struct(&adjacency_matrix1); + putchar('\n'); + + random_adjacency_struct(&adjacency_matrix2); + print_matrix_struct(&adjacency_matrix2); + putchar('\n'); + + gemm_basic_structs(&adjacency_matrix1, &adjacency_matrix2, &dot_product); + print_matrix_struct(&dot_product); + putchar('\n'); + + for (ulong index = 0; index < row_length; index++) { + free(values1[index]); + free(values2[index]); + free(values3[index]); + } + free(values1); + free(values2); + free(values3); } int main(void) { diff --git a/matrix.c b/matrix.c index 70a0058..89fa8d4 100644 --- a/matrix.c +++ b/matrix.c @@ -14,6 +14,15 @@ void print_matrix(const ulong row_length, const ulong column_length, const ulong } } +void print_matrix_struct(const Matrix *matrix) { + for (ulong column_index=0; column_index < matrix->column_length; column_index++) { + for (ulong row_index=0; row_index < matrix->row_length; row_index++) { + printf("%lu ", matrix->values[row_index][column_index]); + } + puts(""); + } +} + void gemm_basic(const ulong row_length1, const ulong column_length1, const ulong matrix1[row_length1][column_length1], const ulong row_length2, const ulong column_length2, const ulong matrix2[row_length2][column_length2], ulong output_matrix[row_length1][column_length2]) { @@ -32,6 +41,22 @@ void gemm_basic(const ulong row_length1, const ulong column_length1, const ulong } } +void gemm_basic_structs(const Matrix *matrix1, const Matrix *matrix2, Matrix *output_matrix) { + ulong sum; + + for (ulong i = 0; i < matrix1->row_length; i++) { + for (ulong j = 0; j < matrix2->column_length; j++) { + sum = 0; + + for (ulong k = 0; k < matrix1->row_length; k++) { + sum += matrix1->values[i][k] * matrix2->values[k][j]; + } + + output_matrix->values[i][j] = sum; + } + } +} + int read_csv(const char *file_name, const ulong row_length, const ulong column_length, ulong output_matrix[row_length][column_length]) { FILE *file_ptr; ulong bufsize = row_length*2+1; // have to account for delimiters diff --git a/matrix.h b/matrix.h index 49c96da..e773b3e 100644 --- a/matrix.h +++ b/matrix.h @@ -2,10 +2,13 @@ #define MATRIX_H typedef unsigned long ulong; +typedef struct matrix {ulong row_length; ulong column_length; ulong **values;} Matrix; void print_matrix(const ulong row_length, const ulong column_length, const ulong matrix[row_length][column_length]); +void print_matrix_struct(const Matrix *matrix); + /* First two matrices will be multiplied and restult will be written to output_matrix. @@ -17,6 +20,9 @@ void gemm_basic(const ulong row_length1, const ulong column_length1, const ulong matrix2[row_length2][column_length2], ulong output_matrix[row_length1][column_length2]); +void gemm_basic_structs(const Matrix *matrix1, const Matrix *matrix2, + Matrix *output_matrix); + int read_csv(const char *file_name, const ulong row_length, const ulong column_length, ulong output_matrix[row_length][column_length]);