diff --git a/examples/bfsExample.cpp b/examples/bfsExample.cpp index ff9d068..fa727a5 100644 --- a/examples/bfsExample.cpp +++ b/examples/bfsExample.cpp @@ -9,21 +9,62 @@ #include #include +#include +#include #include int main() { - std::cout << "Reached here !!!\n"; + // std::cout << "Reached here !!!\n"; + + // float sample_graph1_array[9] = {1, 1, 1, 1, -8, 1, 1, 1, 1}; + // intptr_t sample_graph_length = 3; + // intptr_t sample_graph_width = 3; + // float *allocation_pointer = (float *)malloc(sizeof(float)); + // intptr_t sample_graph_sizes[2] = {sample_graph_width, sample_graph_length}; + // intptr_t sample_graph_strides[2] = {sample_graph_width, sample_graph_length}; + + // MemRef_descriptor sample_graph = + // MemRef_Descriptor(allocation_pointer, sample_graph1_array, 0, + // sample_graph_sizes, sample_graph_strides); + + // graph::graph_bfs(sample_graph, sample_graph, sample_graph); + + int n, m; + float adjMatrix[1000][1000] = {0}; + + std::cout << "Enter the number of nodes and edges: \n"; + std::cin >> n >> m; + + std::cout << "Enter the edges of the graph.\n"; + for (int i = 0; i < m; ++i) { + int x, y; + std::cin >> x >> y; + adjMatrix[x][y] = 1; + adjMatrix[y][x] = 1; + } + + int inputSize = n * n; + float *inputGraph = (float *)malloc(inputSize * sizeof(float)); + + for (int i = 0; i < n; i++) { + for (int j = 0; j < n; j++) { + inputGraph[n * i + j] = (float)adjMatrix[i][j]; + } + } + + intptr_t nodes = n; - float sample_graph1_array[9] = {1, 1, 1, 1, -8, 1, 1, 1, 1}; - intptr_t sample_graph_length = 3; - intptr_t sample_graph_width = 3; float *allocation_pointer = (float *)malloc(sizeof(float)); - intptr_t sample_graph_sizes[2] = {sample_graph_width, sample_graph_length}; - intptr_t sample_graph_strides[2] = {sample_graph_width, sample_graph_length}; - MemRef_descriptor sample_graph = - MemRef_Descriptor(allocation_pointer, sample_graph1_array, 0, - sample_graph_sizes, sample_graph_strides); + intptr_t graph_sizes[2] = {nodes, nodes}; + intptr_t graph_strides[2] = {nodes, nodes}; + + Graph adjMatrix_graph(nodes, &inputGraph); + + MemRef_descriptor input_graph = MemRef_Descriptor( + allocation_pointer, inputGraph, 0, graph_sizes, graph_strides); + + graph::graph_bfs(input_graph, input_graph, input_graph); - graph::graph_bfs(sample_graph, sample_graph, sample_graph); + std::cout << "Graph using adjacency matrix created! \n"; } diff --git a/include/CMakeLists.txt b/include/CMakeLists.txt index e6f347c..132e862 100644 --- a/include/CMakeLists.txt +++ b/include/CMakeLists.txt @@ -1 +1,2 @@ -add_subdirectory(Dialect) \ No newline at end of file +add_subdirectory(Dialect) +add_subdirectory(Interface) \ No newline at end of file diff --git a/include/Interface/CMakeLists.txt b/include/Interface/CMakeLists.txt new file mode 100644 index 0000000..5430278 --- /dev/null +++ b/include/Interface/CMakeLists.txt @@ -0,0 +1,3 @@ +add_library(Interface Container.h GraphContainer.h) + +set_target_properties(Interface PROPERTIES LINKER_LANGUAGE C) \ No newline at end of file diff --git a/include/Interface/Container.h b/include/Interface/Container.h new file mode 100644 index 0000000..24c0e59 --- /dev/null +++ b/include/Interface/Container.h @@ -0,0 +1,54 @@ +//===- Container.h --------------------------------------------------------===// +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +//===----------------------------------------------------------------------===// +// +// Container descriptor. +// +//===----------------------------------------------------------------------===// + + +#ifndef INTERFACE_GRAPH_CORE_CONTAINER_H +#define INTERFACE_GRAPH_CORE_CONTAINER_H + +#include +#include +#include + +// MemRef descriptor. +// - T represents the type of the elements. +// - N represents the number of dimensions. +template class MemRef { + +protected: + // Default constructor. + MemRef() {}; + + // Data. + // The `aligned` and `allocated` members point to the same address, `aligned` + // member is responsible for handling data, and `allocated` member is + // resposible for handling the memory space. + T *allocated; + T *aligned; + // Offset. + intptr_t offset = 0; + // Shape. + intptr_t sizes[N]; + // Strides. + intptr_t strides[N]; + // Number of elements. + size_t size; +}; + +#endif // INTERFACE_GRAPH_CORE_CONTAINER. \ No newline at end of file diff --git a/include/Interface/GraphContainer.h b/include/Interface/GraphContainer.h new file mode 100644 index 0000000..0d36756 --- /dev/null +++ b/include/Interface/GraphContainer.h @@ -0,0 +1,42 @@ +//===- GraphContainer.h ---------------------------------------------------===// +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +//===----------------------------------------------------------------------===// +// +// Graph container descriptor. +// +//===----------------------------------------------------------------------===// + +#ifndef INTERFACE_GRAPHCONTAINER_H +#define INTERFACE_GRAPHCONTAINER_H + +#include + +// Graph container. +// - T represents the type of the elements. +// - N represents the number of dimensions. +template class Graph : public MemRef { + // V is the number of vertices/nodes. + T V; + +public: + // For Adjaceny Matrix. + Graph(T V, T** adjMatrix); + // TODO: + // Add Different contructors. +}; + +#include + +#endif // INTERFACE_GRAPHCONTAINER_H \ No newline at end of file diff --git a/lib/CMakeLists.txt b/lib/CMakeLists.txt index 629c08a..870748a 100644 --- a/lib/CMakeLists.txt +++ b/lib/CMakeLists.txt @@ -1,2 +1,3 @@ add_subdirectory(Conversion) add_subdirectory(Dialect) +add_subdirectory(Interface) \ No newline at end of file diff --git a/lib/Interface/CMakeLists.txt b/lib/Interface/CMakeLists.txt new file mode 100644 index 0000000..a0d996a --- /dev/null +++ b/lib/Interface/CMakeLists.txt @@ -0,0 +1 @@ +add_library(GraphInterface GraphContainer.cpp) \ No newline at end of file diff --git a/lib/Interface/GraphContainer.cpp b/lib/Interface/GraphContainer.cpp new file mode 100644 index 0000000..99ed84e --- /dev/null +++ b/lib/Interface/GraphContainer.cpp @@ -0,0 +1,50 @@ +//===- GraphContainer.cpp -------------------------------------------------===// +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +//===----------------------------------------------------------------------===// +// +// This file implements the Graph container descriptor. +// +//===----------------------------------------------------------------------===// + +#ifndef GRAPH_CONTAINER_DEF +#define GRAPH_CONTAINER_DEF + +#include +#include + +// Adjaceny Matrix constructor. +template Graph::Graph(T V, T **adjMatrix) : MemRef() { + this->size[0] = V; + this->size[1] = V; + this->strides[0] = V; + this->strides[1] = V; + this->allocated = new T[this->size]; + //TODO + // Add the implementation for passing data to alignned. + this->aligned = this->allocated; + int k = 0; + for (int i = 0; i < size[0]; i++) { + for (int j = 0; j < size[1]; j++) { + this->aligned[k] = (T)adjMatrix[i][j]; + k++; + } + } +}; + + +// TODO +// Implement the contructor for different implementation. + +#endif // GRAPH_CONTAINER_DEF \ No newline at end of file