testing around with structs

This commit is contained in:
AustrianToast 2024-10-22 23:38:00 +02:00
parent cddbadfd4a
commit 8ffcc39c9c
Signed by: AustrianToast
GPG Key ID: 1B4D0AAF6E558816
5 changed files with 84 additions and 56 deletions

18
graph.c
View File

@ -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];

View File

@ -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]);

87
main.c
View File

@ -5,8 +5,6 @@
#include <time.h>
#include <stdlib.h>
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) {

View File

@ -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

View File

@ -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]);