From 171ee97d8dd8548c0dc670341284916e72c1d3a4 Mon Sep 17 00:00:00 2001
From: Barbariansyah <bariansyahi@gmail.com>
Date: Fri, 27 Mar 2020 21:24:47 +0700
Subject: [PATCH] first init

---
 .gitignore           |  6 ++++
 src/main.c           | 58 ++++++++++++++++++++++++++++++++++++
 src/utils/dijkstra.c | 54 +++++++++++++++++++++++++++++++++
 src/utils/dijkstra.h | 10 +++++++
 src/utils/matrix.c   | 71 ++++++++++++++++++++++++++++++++++++++++++++
 src/utils/matrix.h   |  9 ++++++
 6 files changed, 208 insertions(+)
 create mode 100644 .gitignore
 create mode 100644 src/main.c
 create mode 100644 src/utils/dijkstra.c
 create mode 100644 src/utils/dijkstra.h
 create mode 100644 src/utils/matrix.c
 create mode 100644 src/utils/matrix.h

diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..b45f823
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,6 @@
+dist
+.vscode
+
+hosts.dev.txt
+*.o
+.DS_Store
\ No newline at end of file
diff --git a/src/main.c b/src/main.c
new file mode 100644
index 0000000..b2ffccf
--- /dev/null
+++ b/src/main.c
@@ -0,0 +1,58 @@
+#include <stdio.h>
+
+#include "utils/matrix.h"
+#include "utils/dijkstra.h"
+
+long int *calculate_sub_matrix(long int *matrix, int node_count, int thread_count);
+
+int main(int argc, char *argv[])
+{
+    int thread_count = strtol(argv[1], NULL, 10);
+    char print_dist;
+
+    setvbuf(stdout, NULL, _IONBF, 0);
+    srand(13517003);
+
+    if (argc < 2)
+    {
+        printf("usage: main <num_of_nodes>");
+        exit(-1);
+    }
+
+    int node_count = atoi(argv[2]);
+    long int *adj_matrix = create_adj_matrix(node_count, node_count);
+
+    double start_time = omp_get_wtime();
+    long int *sub_dist = calculate_sub_matrix(adj_matrix, node_count, thread_count);
+    double time = omp_get_wtime() - start_time;
+
+    printf("Elapsed Time : %f\n", time*1000000);
+    printf("Print distances to stdout? [y/N] ");
+    scanf("%c", &print_dist);
+
+    print_matrix_to_file(sub_dist, node_count, node_count, argv[3]);
+    if (print_dist == 'y' || print_dist == 'Y')
+    {
+        print_matrix(sub_dist, node_count, node_count);
+    }
+
+    free(sub_dist);
+    free(adj_matrix);
+}
+
+long int *calculate_sub_matrix(long int *matrix, int node_count, int thread_count)
+{
+    long int *sub_dist = (long int *)malloc(node_count * node_count * sizeof(long int));
+
+    for (int i = 0; i < node_count; i++)
+    {
+        long int *temp_dist = dijkstra(matrix, i, node_count);
+
+        for (int j = 0; j < node_count; j++)
+        {
+            set_el(sub_dist, node_count, j, i, temp_dist[j]);
+        }
+    }
+
+    return sub_dist;
+}
diff --git a/src/utils/dijkstra.c b/src/utils/dijkstra.c
new file mode 100644
index 0000000..2949cdc
--- /dev/null
+++ b/src/utils/dijkstra.c
@@ -0,0 +1,54 @@
+#include "dijkstra.h"
+
+long int get_idx_min_dist(long int *dist, short *processed, int len)
+{
+    long int min = LONG_MAX;
+    int idx;
+
+    for (int i = 0; i < len; i++)
+    {
+        if (!processed[i] && dist[i] < min)
+        {
+            idx = i;
+            min = dist[i];
+        }
+    }
+
+    return idx;
+}
+
+long int *dijkstra(long int *adj_matrix, int src, int size)
+{
+    long int *dist = (long int *)malloc(size * sizeof(long int));
+    short processed[size];
+
+    for (int i = 0; i < size; i++)
+    {
+        dist[i] = LONG_MAX;
+        processed[i] = FALSE;
+    }
+
+    dist[src] = 0L;
+
+    for (int j = 0; j < size; j++)
+    {
+        int u = get_idx_min_dist(dist, processed, size);
+        processed[u] = TRUE;
+
+        for (int i = 0; i < size; i++)
+        {
+            if (get_el(adj_matrix, size, i, u) == 0 && u != i)
+            {
+                continue;
+            }
+
+            long int next_dist = dist[u] + get_el(adj_matrix, size, i, u);
+            if (next_dist < dist[i])
+            {
+                dist[i] = next_dist;
+            }
+        }
+    }
+
+    return dist;
+}
\ No newline at end of file
diff --git a/src/utils/dijkstra.h b/src/utils/dijkstra.h
new file mode 100644
index 0000000..d143e6b
--- /dev/null
+++ b/src/utils/dijkstra.h
@@ -0,0 +1,10 @@
+#include <limits.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <assert.h>
+#include "matrix.h"
+
+#define TRUE 1
+#define FALSE 0
+
+long int *dijkstra(long int *adj_matrix, int src, int size);
diff --git a/src/utils/matrix.c b/src/utils/matrix.c
new file mode 100644
index 0000000..3cb4c93
--- /dev/null
+++ b/src/utils/matrix.c
@@ -0,0 +1,71 @@
+#include "matrix.h"
+
+void print_array(long int *array, int width)
+{
+    for (int i = 0; i < width; i++)
+    {
+        printf("%10ld\t", array[i]);
+    }
+    printf("\n");
+}
+
+void print_matrix(long int *matrix, int width, int height)
+{
+    for (int i = 0; i < height; i++)
+    {
+        for (int j = 0; j < width; j++)
+        {
+            printf("%10ld\t", matrix[i * width + j]);
+        }
+        printf("\n");
+    }
+}
+
+void print_matrix_to_file(long int *matrix, int width, int height, char *filename)
+{
+    FILE *fp;
+
+    fp = fopen(filename, "w+");
+
+    for (int i = 0; i < height; i++)
+    {
+        for (int j = 0; j < width; j++)
+        {
+            fprintf(fp, "%10ld\t", matrix[i * width + j]);
+        }
+        fprintf(fp, "\n");
+    }
+    fclose(fp);
+}
+
+long int *create_adj_matrix(int width, int height)
+{
+    long int *matrix = (long int *)malloc(width * height * sizeof(long int));
+
+    for (int i = 0; i < height; i++)
+    {
+        for (int j = 0; j < width; j++)
+        {
+            if (i == j)
+                matrix[i * width + j] = 0;
+            else if (i < j)
+            {
+                long int temp = (long int)rand();
+                matrix[i * width + j] = temp;
+                matrix[j * width + i] = temp;
+            }
+        }
+    }
+
+    return matrix;
+}
+
+long int get_el(long int *matrix, int width, int x, int y)
+{
+    return matrix[y * width + x];
+}
+
+void set_el(long int *matrix, int width, int x, int y, long int value)
+{
+    matrix[y * width + x] = value;
+}
diff --git a/src/utils/matrix.h b/src/utils/matrix.h
new file mode 100644
index 0000000..c02cbb6
--- /dev/null
+++ b/src/utils/matrix.h
@@ -0,0 +1,9 @@
+#include <stdio.h>
+#include <stdlib.h>
+
+void print_array(long int *array, int width);
+void print_matrix(long int *matrix, int width, int height);
+void print_matrix_to_file(long int *matrix, int width, int height, char *filename);
+long int get_el(long int *matrix, int width, int x, int y);
+void set_el(long int *matrix, int width, int x, int y, long int value);
+long int *create_adj_matrix(int width, int height);
\ No newline at end of file
-- 
GitLab