diff --git a/(p,t)_sparsification/main.cpp b/(p,t)_sparsification/main.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..ce3bc9d20300afda0857d880878610a693c7c174
--- /dev/null
+++ b/(p,t)_sparsification/main.cpp
@@ -0,0 +1,95 @@
+#include <iostream>
+#include <chrono>
+#include "p_k_compression.h"
+#include <boost/program_options.hpp>
+#include "graph.h"
+#include "io.h"
+#include <sstream>
+#include <string>
+#include <fstream>
+#include "hash.h"
+
+
+using  namespace std;
+namespace po = boost::program_options;
+
+
+
+int main(int argc, char *argv[]) {
+
+    srand((unsigned)time(NULL));
+
+    po::options_description desc("Allowed options");
+    desc.add_options()
+            ("help", "produce help message")
+            ("input", po::value<string>(), "graph file name")
+            ("directed", po::value<bool>()->default_value(true), "is the graph directed?")
+            ("algorithm",po::value<string>()->default_value("Random"), "The compression Algorithm")
+            ("depth",po::value<int>()->default_value(2),"the depth of the compression")
+            ("proportions",po::value<std::vector<double> >()->multitoken(),"the preserving proportions")
+            ("output_file",po::value<string>(), "the path of the compressed graph");
+
+    po::variables_map var;
+    po::store(po::parse_command_line(argc, argv, desc), var);
+    po::notify(var);
+
+    if(var.count("help")) {
+        cout << desc << "\n";
+        return 0;
+    }
+
+    if(!var.count("input")) {
+        cout << "Missing argument --input.\n";
+        return 1;
+    }
+    if(!var.count("output_file")) {
+        cout << "Missing argument --output_file.\n";
+        return 1;
+    }
+
+    graph g2;
+
+    vector<int> s ;
+    vector<double> c ;
+    // perform 30 experiments
+    for (int i =0; i<30;i++) {
+        cout << i << endl;
+        string file_name = var["input"].as<string>() + to_string(i) + ".txt";
+        double compression_rate = 0;
+        auto[g, e_s] = read_graph_from_file(file_name, var["directed"].as<bool>());
+        auto start = chrono::steady_clock::now();
+
+        if (var["algorithm"].as<string>() == "Random") {
+            g2 = compress_graph_basic(g, var["depth"].as<int>(), var["proportions"].as<vector<double>>(),
+                                      var["directed"].as<bool>());
+
+        } else if (var["algorithm"].as<string>() == "LP") {
+            g2 = compress_graph_LP(g, e_s, var["depth"].as<int>(), var["proportions"].as<vector<double>>(),
+                                var["directed"].as<bool>());
+
+        } else if (var["algorithm"].as<string>() == "SA") {
+            g2 = Simulated_annealing(1000, 10, 0.99, g, var["directed"].as<bool>(), var["depth"].as<int>(),
+                                     var["proportions"].as<vector<double>>());
+        }else if (var["algorithm"].as<string>() == "Greedy") {
+            g2 = compress_graph_greedy(g, var["depth"].as<int>(), var["proportions"].as<vector<double>>(),
+                                      var["directed"].as<bool>());
+
+        }
+
+        auto finish = chrono::steady_clock::now();
+        vector<edge> edges_original = get_edges(g, var["directed"].as<bool>());
+        vector<edge> edges_compressed = get_edges(g2, var["directed"].as<bool>());
+
+        double elapsed_time = chrono::duration_cast<chrono::duration<double>>(finish - start).count();
+        compression_rate = ((double) (edges_original.size() - edges_compressed.size()) /
+                            edges_original.size());
+         c.push_back(compression_rate);
+         s.push_back(edges_compressed.size());
+        //graph_to_file(var, elapsed_time, compression_rate, edges_compressed);
+        cout << "compression time " << elapsed_time << endl;
+        cout << "compression rate " << compression_rate << endl;
+    }
+    for (int i = 0 ; i<30;i++) cout << c.at(i) << '\t' << s.at(i) << endl;
+
+    return 0;
+}