From 8198093375544a71697f214ae071361924c28f0b Mon Sep 17 00:00:00 2001
From: Guilherme Werner <guilherme.werner@tribufu.com>
Date: Sun, 18 Jun 2023 20:26:07 -0300
Subject: [PATCH] New tests

---
 Article.txt      | 53 +++++++++++++++++++++++++++++++++++
 Permutation.txt  | 32 +++++++++++++++++++++
 Source/Graph.cpp | 72 ++++++++++++++++++++++++++++++++++++++++++++++++
 Source/Graph.h   |  2 ++
 Source/Main.cpp  | 31 +++++++++++----------
 5 files changed, 175 insertions(+), 15 deletions(-)
 create mode 100644 Article.txt
 create mode 100644 Permutation.txt

diff --git a/Article.txt b/Article.txt
new file mode 100644
index 0000000..74a8f64
--- /dev/null
+++ b/Article.txt
@@ -0,0 +1,53 @@
+M1:
+ 1  1  1  0  0  0  0  0 -1  0 
+-1  0  0  1  1  1  0  0  0  0 
+ 0 -1  0 -1  0  0  1  0  0 -1 
+ 0  0 -1  0 -1  0 -1  1  0  0 
+ 0  0  0  0  0  0  0  0  1  1 
+ 0  0  0  0  0 -1  0 -1  0  0 
+
+0 1 1 1 0 0 
+0 0 1 1 0 1 
+0 0 0 1 0 0 
+0 0 0 0 0 1 
+1 0 1 0 0 0 
+0 0 0 0 0 0 
+
+TC:
+1 1 1 1 0 1 
+0 1 1 1 0 1 
+0 0 1 1 0 1 
+0 0 0 1 0 1 
+1 1 1 1 1 1 
+0 0 0 0 0 1 
+
+M2:
+-1  1  1  1  1  0  0  0  0  0  0  0  0  0 -1  0  0  0  0  0  0 
+ 0 -1  0  0  0 -1  1  1  1  0  0  0  0  0  0 -1  0  0  0  0  0 
+ 0  0 -1  0  0  0 -1  0  0 -1  1  1  0  0  0  0 -1  0  0  0  0 
+ 0  0  0 -1  0  0  0 -1  0  0 -1  0 -1  1  0  0  0 -1  0  0  0 
+ 0  0  0  0  0  0  0  0  0  0  0  0  0  0  1  1  1  1 -1  1  0 
+ 0  0  0  0 -1  0  0  0 -1  0  0 -1  0 -1  0  0  0  0  0 -1 -1 
+
+0 1 1 1 0 1 
+0 0 1 1 0 1 
+0 0 0 1 0 1 
+0 0 0 0 0 1 
+1 1 1 1 0 1 
+0 0 0 0 0 0 
+
+M3:
+-1  0  0  1  1 -1  0  1  1 -1  1  1  0  0 -1 -1 -1  0  0  0  0 
+ 1 -1 -1 -2 -2  0  0 -1 -1  0 -1 -1 -1  0  2  1  1  0 -1  0 -1 
+ 0  1  0  1  0  1 -1  0 -1  0  1  0  1 -1  0  1  0  1  0  0  0 
+ 0  0  1  0  0  0  1  0  0  1 -1 -1  0  0 -1 -1  0 -1  1 -1  0 
+ 0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0 
+ 0  0  0  0  1  0  0  0  1  0  0  1  0  1  0  0  0  0  0  1  1 
+
+0 1 0 0 0 0 
+1 0 0 0 0 0 
+1 1 0 1 0 0 
+1 1 1 0 0 0 
+0 0 0 0 0 0 
+0 1 1 1 0 0 
+
diff --git a/Permutation.txt b/Permutation.txt
new file mode 100644
index 0000000..e12d446
--- /dev/null
+++ b/Permutation.txt
@@ -0,0 +1,32 @@
+G1:
+0 1 1 1 0 0 
+0 0 1 1 0 1 
+0 0 0 1 0 0 
+0 0 0 0 0 1 
+1 0 1 0 0 0 
+0 0 0 0 0 0 
+
+TC:
+1 1 1 1 0 1 
+0 1 1 1 0 1 
+0 0 1 1 0 1 
+0 0 0 1 0 1 
+1 1 1 1 1 1 
+0 0 0 0 0 1 
+
+G2:
+0 1 0 0 0 0 
+0 0 1 0 0 1 
+0 0 0 1 0 0 
+0 0 0 0 0 1 
+1 0 0 0 0 0 
+0 0 0 0 0 0 
+
+TC:
+1 1 1 1 0 1 
+0 1 1 1 0 1 
+0 0 1 1 0 1 
+0 0 0 1 0 1 
+1 1 1 1 1 1 
+0 0 0 0 0 1 
+
diff --git a/Source/Graph.cpp b/Source/Graph.cpp
index 9a666c0..b44bc4c 100644
--- a/Source/Graph.cpp
+++ b/Source/Graph.cpp
@@ -116,6 +116,78 @@ Graph *Graph::ToTransitiveClosure()
     return new Graph(closure, closure.size());
 }
 
+void Graph::TransitiveReduction()
+{
+    auto closure = this->GetAdjacencyMatrix();
+
+    cout << "G1:" << endl;
+    Graph::_PrintAdjacencyMatrix(closure);
+
+    for (auto k = 0; k < this->nodes; k++)
+    {
+        for (auto i = 0; i < this->nodes; i++)
+        {
+            for (auto j = 0; j < this->nodes; j++)
+            {
+                if (i == j)
+                {
+                    closure[i][j] = 1;
+                }
+                else
+                {
+                    closure[i][j] = closure[i][j] || (closure[i][k] && closure[k][j]);
+                }
+            }
+        }
+    }
+
+    cout << "TC:" << endl;
+    Graph::_PrintAdjacencyMatrix(closure);
+
+    auto reduction = this->GetAdjacencyMatrix();
+
+    for (auto j = 0; j < this->nodes; j++)
+    {
+        for (auto i = 0; i < this->nodes; i++)
+        {
+            if (reduction[i][j] == 1)
+            {
+                for (auto k = 0; k < this->nodes; k++)
+                {
+                    if (reduction[j][k] == 1)
+                    {
+                        reduction[i][k] = 0;
+                    }
+                }
+            }
+        }
+    }
+
+    cout << "G2:" << endl;
+    Graph::_PrintAdjacencyMatrix(reduction);
+
+    for (auto k = 0; k < this->nodes; k++)
+    {
+        for (auto i = 0; i < this->nodes; i++)
+        {
+            for (auto j = 0; j < this->nodes; j++)
+            {
+                if (i == j)
+                {
+                    reduction[i][j] = 1;
+                }
+                else
+                {
+                    reduction[i][j] = reduction[i][j] || (reduction[i][k] && reduction[k][j]);
+                }
+            }
+        }
+    }
+
+    cout << "TC:" << endl;
+    Graph::_PrintAdjacencyMatrix(reduction);
+}
+
 /*
 void Graph::TransitiveClosure()
 {
diff --git a/Source/Graph.h b/Source/Graph.h
index e34284e..c9abda3 100644
--- a/Source/Graph.h
+++ b/Source/Graph.h
@@ -87,6 +87,8 @@ public:
 
     Graph *ToTransitiveClosure();
 
+    void TransitiveReduction();
+
 public:
     static vector<vector<int>> MultiplyIncidenceMatrix(const vector<vector<int>> &matrix1, const vector<vector<int>> &matrix2)
     {
diff --git a/Source/Main.cpp b/Source/Main.cpp
index 082de78..07a4f75 100644
--- a/Source/Main.cpp
+++ b/Source/Main.cpp
@@ -5,7 +5,6 @@ int main()
     int nodes = 6;
     Graph *g1 = new Graph(nodes);
 
-    g1->AddEdge(0, 0);
     g1->AddEdge(0, 1);
     g1->AddEdge(0, 2);
     g1->AddEdge(0, 3);
@@ -17,22 +16,24 @@ int main()
     g1->AddEdge(4, 0);
     g1->AddEdge(4, 2);
 
-    cout << "M1:" << endl;
-    g1->PrintIncidenceMatrix();
-    g1->PrintAdjacencyMatrix();
-    auto m1 = g1->GetIncidenceMatrix();
+    g1->TransitiveReduction();
 
-    Graph *g2 = g1->ToTransitiveClosure();
-    cout << "M2:" << endl;
-    g2->PrintIncidenceMatrix();
-    g2->PrintAdjacencyMatrix();
-    auto m2 = g2->GetIncidenceMatrix();
+    // cout << "M1:" << endl;
+    // g1->PrintIncidenceMatrix();
+    // g1->PrintAdjacencyMatrix();
+    // auto m1 = g1->GetIncidenceMatrix();
 
-    auto m3 = Graph::MultiplyIncidenceMatrix(m1, m2);
-    Graph *g3 = new Graph(m3);
-    cout << "M3:" << endl;
-    g3->PrintIncidenceMatrix();
-    g3->PrintAdjacencyMatrix();
+    // Graph *g2 = g1->ToTransitiveClosure();
+    // cout << "M2:" << endl;
+    // g2->PrintIncidenceMatrix();
+    // g2->PrintAdjacencyMatrix();
+    // auto m2 = g2->GetIncidenceMatrix();
+
+    // auto m3 = Graph::MultiplyIncidenceMatrix(m1, m2);
+    // Graph *g3 = new Graph(m3);
+    // cout << "M3:" << endl;
+    // g3->PrintIncidenceMatrix();
+    // g3->PrintAdjacencyMatrix();
 
     return 0;
 }