diff --git a/deferred_planarity_test/include/mps.h b/deferred_planarity_test/include/mps.h index e2d7639..4a99594 100644 --- a/deferred_planarity_test/include/mps.h +++ b/deferred_planarity_test/include/mps.h @@ -158,7 +158,7 @@ public: int find_mps(string input_file); int compute_removed_edge_size(string input_file, vector post_order); vector generate_post_order(string input_file); - vector generate_mutated_post_order(string input_file, vector post_order); + vector generate_mutated_post_order(string input_file, vector post_order, int mutate_point); vector generate_guided_post_order(string input_file, vector post_order); node* get_new_node(node_type t); void read_from_gml(string input_file); @@ -166,7 +166,7 @@ public: vector return_post_order(); void postOrderTraversal(); void guidedPostOrderTraversal(vector post_order); - void mutatedPostOrderTraversal(vector post_order); + void mutatedPostOrderTraversal(vector post_order, int mutate_point); // void set_post_order(vector post_order); void print_post_order(); void sort_adj_list(); diff --git a/deferred_planarity_test/src/main.cpp b/deferred_planarity_test/src/main.cpp index 3d258b0..acb33a7 100644 --- a/deferred_planarity_test/src/main.cpp +++ b/deferred_planarity_test/src/main.cpp @@ -19,32 +19,41 @@ using namespace std; int compute_removed_edge_size(string input_file, vector post_order); +// these functions are defined in mps_test.cpp +// but their signatures are not in mps.h, hence they are declared here vector generate_post_order(string input_file); -vector generate_mutated_post_order(string input_file, vector post_order); +vector generate_mutated_post_order(string input_file, vector post_order, int mutate_point); vector generate_guided_post_order(string input_file, vector post_order); +void vector_printer(vector state) { + for (int i = 0; i < state.size(); ++i) { + std::cout << state[i] << ","; + } + std::cout << std::endl; +} -vector repeated_mutation(string input_file, int k_max) { + +vector repeated_mutation(string input_file, int k_max, int mutate_point) { // generate first post order std::cout << "generate first post order" << std::endl; vector state_old = generate_post_order(input_file); vector state_new; - int num_removed_edges; + for (int k = 0; k < k_max; ++k) { - // rotate it first std::cout << "cycle:" << k << std::endl; - std::cout << "rotate the dfs tree" << std::endl; - state_new = generate_guided_post_order(input_file, state_old); - // then the next traversal will rotate it back - std::cout << "mutate the dfs tree" << std::endl; - state_new = generate_mutated_post_order(input_file, state_new); - // num_removed_edges = compute_removed_edge_size(input_file, state_new); - // first time will rotate the tree - std::cout << "rotate the dfs tree" << std::endl; - state_new = generate_guided_post_order(input_file, state_new); - // second time will rotate back the rotated tree - std::cout << "print the mutated tree again" << std::endl; + + vector_printer(state_old); + + + // mutation produces rotated view + state_new = generate_mutated_post_order(input_file, state_old, mutate_point); + vector_printer(state_new); + + // another round of guided post order gives canonical representation state_new = generate_guided_post_order(input_file, state_new); + vector_printer(state_new); + + std::cout << std::endl; } return state_new; @@ -76,9 +85,10 @@ int get_graph_size(string input_file) { int main(int argc, char* argv[]) { string input_file = argv[1]; int k_max = std::stoi(argv[2]); + int mutate_point = std::stoi(argv[3]); // generate order here - vector post_order = repeated_mutation(input_file, k_max); + vector post_order = repeated_mutation(input_file, k_max, mutate_point); // test_correctness(input_file); // // print final order and number of edges diff --git a/deferred_planarity_test/src/mps.cpp b/deferred_planarity_test/src/mps.cpp index 2b3a886..0c07fbd 100644 --- a/deferred_planarity_test/src/mps.cpp +++ b/deferred_planarity_test/src/mps.cpp @@ -85,7 +85,7 @@ maximal_planar_subgraph_finder::guidedPostOrderTraversal(vector post_order) // take in a post-order argument then traces the graph in the same order // return is by reference via _post_order_list void -maximal_planar_subgraph_finder::mutatedPostOrderTraversal(vector post_order) { +maximal_planar_subgraph_finder::mutatedPostOrderTraversal(vector post_order, int mutate_point) { node::init_mark(); vector rev_post_order; @@ -95,27 +95,13 @@ maximal_planar_subgraph_finder::mutatedPostOrderTraversal(vector post_order int postOrderID = 0; int traversal_index = 0; - // introduce random selection - std::random_device rd; - std::mt19937 rng(rd()); - // Define the range [0, n] + // Define the range [0, n] int n = _node_list.size() - 1; // Change 'n' to your desired upper bound - // Create a uniform distribution for the range [0, n] - std::uniform_int_distribution distribution(0, n); - // Generate a random number between 0 and n (inclusive) - int mutate_point = distribution(rng); - // std::cout << "the mutate point: " << mutate_point << std::endl; // set loop variables int start = rev_post_order[0]; int i = start; - // if mutate_point = 0 - if (mutate_point == 0) { - // generate another point - start = distribution(rng); - } - int end_condition = _node_list.size(); // this loop assumes start is not from 0 diff --git a/deferred_planarity_test/src/mps_test.cpp b/deferred_planarity_test/src/mps_test.cpp index 38d3a0d..47b4259 100644 --- a/deferred_planarity_test/src/mps_test.cpp +++ b/deferred_planarity_test/src/mps_test.cpp @@ -5,7 +5,7 @@ #include "mps.h" #include -#define DEBUG +// #define DEBUG //----------------------------------------------------------------------------------- // Finding MPS @@ -28,9 +28,9 @@ vector generate_post_order(string input_file) { return m.generate_post_order(input_file); } -vector generate_mutated_post_order(string input_file, vector post_order) { +vector generate_mutated_post_order(string input_file, vector post_order, int mutate_point) { maximal_planar_subgraph_finder m; - return m.generate_mutated_post_order(input_file, post_order); + return m.generate_mutated_post_order(input_file, post_order, mutate_point); } vector generate_guided_post_order(string input_file, vector post_order) { @@ -68,9 +68,9 @@ vector maximal_planar_subgraph_finder::generate_post_order(string input_fil } // result of this will be used as input to "compute_removed_edge_size" -vector maximal_planar_subgraph_finder::generate_mutated_post_order(string input_file, vector post_order) { +vector maximal_planar_subgraph_finder::generate_mutated_post_order(string input_file, vector post_order, int mutate_point) { read_from_gml(input_file); - mutatedPostOrderTraversal(post_order); + mutatedPostOrderTraversal(post_order, mutate_point); #ifdef DEBUG std::cout << "mutated post order traversal" << std::endl; @@ -85,10 +85,10 @@ vector maximal_planar_subgraph_finder::generate_guided_post_order(string in read_from_gml(input_file); guidedPostOrderTraversal(post_order); - #ifdef DEBUG - std::cout << "guided post order traversal" << std::endl; - print_post_order(); - #endif + // #ifdef DEBUG + // std::cout << "guided post order traversal" << std::endl; + // print_post_order(); + // #endif return return_post_order(); } diff --git a/deferred_planarity_test/src/node.cpp b/deferred_planarity_test/src/node.cpp index 93c856d..6ce6378 100644 --- a/deferred_planarity_test/src/node.cpp +++ b/deferred_planarity_test/src/node.cpp @@ -5,6 +5,7 @@ #include "mps.h" // #define DEBUG +#define DEBUG_MUTATION //----------------------------------------------------------------------------------- // CONSTRUCTOR @@ -165,6 +166,14 @@ void node::mutated_DFS_visit(vector &dfsList, std::mt19937 rng(rd()); // Use std::shuffle to shuffle the elements in the vector std::shuffle(neighbor_list.begin(), neighbor_list.end(), rng); + + #ifdef DEBUG_MUTATION + std::cout << "current node:" << this->node_id() << std::endl; + for (int i = 0; i < neighbor_list.size(); ++i) { + std::cout << neighbor_list[i]->node_id() << "(" << neighbor_list[i]->is_marked() << ")" << ","; + } + std::cout << std::endl; + #endif } // increment traversal index after checking